Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
SergMic
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 4
03.02.2014, 13:24     Использование шаблоных методов #1
Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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 ошибок нет.

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

Добавлено через 1 час 30 минут
Не уже ли нет знатоков С++?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
03.02.2014, 13:36     Использование шаблоных методов #2
вроде работает, может причина в
C++
1
2
3
4
static void Set( unsigned param )
    {
      GPIOA->ODR = param;
    }
что такое GRIOA->ODR, я закоментил ее и у меня собралось MSVS2012
SergMic
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 4
03.02.2014, 13:38  [ТС]     Использование шаблоных методов #3
GPIOA->ODR это глобальная переменная, регистр в микроконтроллере. Для управления которой все и создавалось. Компилятор Keil.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
03.02.2014, 13:48     Использование шаблоных методов #4
а Вы уверены что в нем поддерживаются шаблоны?
SergMic
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 4
03.02.2014, 15:50  [ТС]     Использование шаблоных методов #5
Конечно уверен))) Т.к. конструкция D::SetConfig<D::Fisrt>( ) работает.

Добавлено через 1 час 43 минуты
Только начинаю писать на С++. Не разочаровывайте меня)))) Посчитаю, что знающих С++ просто нет и не у кого учится)))
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
03.02.2014, 16:04     Использование шаблоных методов #6
Ошибка возникает при вызове шаблонной функции из шаблонного класса. Решается эта проблема вот так:
C++
1
      Port::template SetConfig< Port::Fisrt >( );
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
03.02.2014, 16:10     Использование шаблоных методов #7
Ilot, красава, странно что такие вещи вижа ест а g++ нет...(
у меня как раз такая запара была при компиляции на g++

Добавлено через 3 минуты

Не по теме:

в g++ даж вывод понятнее (
templ.cpp: In static member function 'static void C<Port>::Init()':
templ.cpp:41: error: expected primary-expression before ')' token
templ.cpp: In static member function 'static void C<Port>::Init() [with Port = B<A, 14u>]':
templ.cpp:52: instantiated from here
templ.cpp:41: 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'

DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
03.02.2014, 16:13     Использование шаблоных методов #8
Цитата Сообщение от SergMic Посмотреть сообщение
Конечно уверен))) Т.к. конструкция D::SetConfig<D::Fisrt>( ) работает.

Добавлено через 1 час 43 минуты
Только начинаю писать на С++. Не разочаровывайте меня)))) Посчитаю, что знающих С++ просто нет и не у кого учится)))
C++
1
2
3
4
5
6
7
8
9
10
11
12
template< class Port >
class C
{
public:
 
    static void Init( )
    {
        Port::template SetConfig< Port::Fisrt >( ); // FIXED
        Port::SetConfig( Port::Fisrt );
    }
 
};
Смотри коммент. Ключевое слово template нужно тут по стандарту. Вкратце: если шаблон зависит от другого шаблона - его надо явно обозначить. Неоднозначность в трактовке < и > как угловых скобок либо как отдельных операторов. Это можно определить, либо зная роль данного зависимого имени, либо указав явно 'template'.

Тут подробнее.

PS. А собираемость кода в VC++ вообще не критерий.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
03.02.2014, 16:14     Использование шаблоных методов #9
Цитата Сообщение от DrOffset Посмотреть сообщение
А собираемость кода в VC++ вообще не критерий
хорошо, раз это часть стандарта, чтож эта зараза молчит (
SergMic
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 4
03.02.2014, 16:29  [ТС]     Использование шаблоных методов #10
Спасибо))) И отдельное спасибо за разъяснения сути) Это как раз то что хотел... понять суть)
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
03.02.2014, 16:37     Использование шаблоных методов #11
Цитата Сообщение от aLarman Посмотреть сообщение
хорошо, раз это часть стандарта, чтож эта зараза молчит (
В VC++ подругому реализована обработка шаблонов. Там отсутствует так называемый two phase lookup, который требуется стандартом. В студии построение AST для шаблоного кода откладывается до момента инстанцирования, когда уже понятно какие типы будут подставлены. Соответственно отличить шаблон от нешаблона VС++ в вышеупомянутом прекрасно может. GCC сразу пытается построить AST, но на этом этапе типы еще неизвестны, потому нужна подсказка. Насчет two phase lookup тема холиварная, много споров нужен он или нет, но у него есть неоспоримое преимущество: ошибку в шаблонном коде можно сразу распознать, в VC++ же в шаблоне можно написать всякую ахиненю, до первой инстанции он и носом не поведет, чтобы сказать об этом.

В VС++ это сделано сознательно, потому что при таком подходе очень сильно ускоряется обработка файлов с шаблонным кодом, который написан, но не инстанцирован.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2014, 16:47     Использование шаблоных методов
Еще ссылки по теме:

Использование private-членов класса в сигнатуре методов C++
Использование static методов C++
C++ Использование статических методов класса в динамических библиотеках

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
aLarman
03.02.2014, 16:47     Использование шаблоных методов
  #12

Не по теме:

DrOffset, спс Вам

Yandex
Объявления
03.02.2014, 16:47     Использование шаблоных методов
Ответ Создать тему
Опции темы

Текущее время: 01:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru