Перейти к содержанию
    

Использование шаблонных методов С++

Есть код:

 

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 ошибок нет.

 

В чем моя ошибка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 с последующей синтаксической ошибкой на хвост выражения.

 

Похоже это не лечится.

 

А можно вопрос - нафига это надо? Чем нормальный параметр не устраивает?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне необходимо вызвать шаблонный метод Port::SetConfig< Port::Fisrt >( ), который даст короткий код.

И это лечится)) Подсказали на другом форуме.

Надо вот так:

Port:: template SetConfig< Port::Fisrt >( );

 

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

 

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

 

Топик закрыт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне необходимо вызвать шаблонный метод Port::SetConfig< Port::Fisrt >( ), который даст короткий код.
Если включена оптимизация, то код будет один и тот же (байт в байт). Если оптимизация выключена, то короткий код не спасет :)

 

И это лечится)) Подсказали на другом форуме.
Посыпаю голову пеплом. Совсем забыл про эту конструкцию :laughing:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...