реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Использование шаблонных методов С++
SergSit
сообщение Feb 2 2014, 19:57
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 173
Регистрация: 9-12-05
Пользователь №: 12 031



Есть код:

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

В чем моя ошибка?
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 3 2014, 09:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

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

А можно вопрос - нафига это надо? Чем нормальный параметр не устраивает?
Go to the top of the page
 
+Quote Post
SergSit
сообщение Feb 3 2014, 12:34
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 173
Регистрация: 9-12-05
Пользователь №: 12 031



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


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

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

Топик закрыт.
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 3 2014, 16:41
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

Цитата
И это лечится)) Подсказали на другом форуме.
Посыпаю голову пеплом. Совсем забыл про эту конструкцию laughing.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 15:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016