SergSit 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Есть код: class A { public: static void Set( unsigned param ) { GPIOA->ODR = param; } }; template< class ClassTemp1, uint8_t number > class B { public: enum Config { Fisrt, Second, }; static void SetConfig( Config param ) { ClassTemp1::Set( param ); } template< Config param > static void SetConfig( ) { ClassTemp1::Set( param ); } }; template< class Port > class C { public: static void Init( ) { Port::SetConfig< Port::Fisrt >( ); Port::SetConfig( Port::Fisrt ); } }; typedef B< A, 14 > D; typedef C< D > Proba; int main( void ) { Proba::Init( ); D::SetConfig( D::Fisrt ); D::SetConfig<D::Fisrt>( ); } Компилятор дает ошибку на строчке с методом Port::SetConfig< Port::Fisrt >( ); в методе C::Init(): compiling main.cpp... src\main.cpp(99): error: #29: expected an expression Port::SetConfig< Port::Fisrt >( ); Хотя если напрямую вызывать методы из класса D ошибок нет. В чем моя ошибка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 3 февраля, 2014 Опубликовано 3 февраля, 2014 · Жалоба template< Config param > static void SetConfig( ) { ClassTemp1::Set( param ); } Тут вы пытаетесь передать в ClassTemp1::Set тип в качестве параметра. А надо выражение (объект например). Например так - template< Config param > static void SetConfig( ) { ClassTemp1::Set( param() ); } Пардон, отбой. Config у вас enum внутри класса. Сейчас попробую это g++ скормить ... Вот ругань g++: err.cpp: In static member function static void C<Port>::Init(): err.cpp:45:39: error: expected primary-expression before ) token err.cpp: In static member function static void C<Port>::Init() [with Port = B<A, 14u>]: err.cpp:57:10: instantiated from here err.cpp:45:7: error: no match for operator< in B::SetConfig [with B<ClassTemp1, number>::Config param = param, ClassTemp1 = A, unsigned char number = 14u] < B<A, 14u>::Fisrt Судя по сообщению компилятор понял, что в Port::SetConfig< Port::Fisrt >( ); у вас стоит не специализация шаблона, а Port::SetConfig< Port::Fisrt с последующей синтаксической ошибкой на хвост выражения. Похоже это не лечится. А можно вопрос - нафига это надо? Чем нормальный параметр не устраивает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergSit 0 3 февраля, 2014 Опубликовано 3 февраля, 2014 · Жалоба Мне необходимо вызвать шаблонный метод Port::SetConfig< Port::Fisrt >( ), который даст короткий код. И это лечится)) Подсказали на другом форуме. Надо вот так: Port:: template SetConfig< Port::Fisrt >( ); И дали ссылку на разъяснения: Решение проблемы из стандарта Топик закрыт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 3 февраля, 2014 Опубликовано 3 февраля, 2014 · Жалоба Мне необходимо вызвать шаблонный метод Port::SetConfig< Port::Fisrt >( ), который даст короткий код.Если включена оптимизация, то код будет один и тот же (байт в байт). Если оптимизация выключена, то короткий код не спасет :) И это лечится)) Подсказали на другом форуме.Посыпаю голову пеплом. Совсем забыл про эту конструкцию :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться