Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Использование шаблонных методов С++
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
SergSit
Есть код:

Код
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
Код
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
Мне необходимо вызвать шаблонный метод Port::SetConfig< Port::Fisrt >( ), который даст короткий код.
И это лечится)) Подсказали на другом форуме.
Надо вот так:
Код
Port:: template SetConfig< Port::Fisrt >( );


И дали ссылку на разъяснения:

Решение проблемы из стандарта

Топик закрыт.
XVR
Цитата(SergSit @ Feb 3 2014, 16:34) *
Мне необходимо вызвать шаблонный метод Port::SetConfig< Port::Fisrt >( ), который даст короткий код.
Если включена оптимизация, то код будет один и тот же (байт в байт). Если оптимизация выключена, то короткий код не спасет sm.gif

Цитата
И это лечится)) Подсказали на другом форуме.
Посыпаю голову пеплом. Совсем забыл про эту конструкцию laughing.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.