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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
SergMic
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 4
#1

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

03.02.2014, 13:24. Просмотров 360. Ответов 11
Метки нет (Все метки)

Есть код:
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 минут
Не уже ли нет знатоков С++?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2014, 13:24     Использование шаблоных методов
Посмотрите здесь:

Использование рекурсивных методов - C++
Потрібен приклади використання рекурсивних методів / надо примеры использование рекурсивных методов ..

Использование static методов - C++
Здравствуйте ,у меня есть код для очереди ,но мне хочется ,чтобы функции работали без создания объектов или как я помню из частичного курса...

Использование переборных методов - C++
Ребят! Помогите решить задачу!! Использование переборных методов разработка программы нахождения кратчайшего пути передвижения различных...

Использование полей и методов в дочерних классах - C++
Возникла проблема class Subj { public: char name; char prepod; int hours; bool exam; bool credit;

Использование методов класса в самом классе - C++
Вообще есть класс нужно объедение все его методы в один метод. Пример: class Test{ public: int N; private: Test(){ ...

Использование массивов внутри методов класса - C++
Нужно сделать так, чтобы массив NextBrick можно было использовать в ShowNB. При этом Массив NextBrick может быть либо вне либо внутри ...

Использование статических методов класса в динамических библиотеках - C++
Здравствуйте. Прочитав пару тредов, статтей, да поклацав в компилятор у меня получилось слинковать обычную функцию. А как быть с...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
641 / 562 / 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
641 / 562 / 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
Модератор
Эксперт С++
1789 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
03.02.2014, 16:04     Использование шаблоных методов #6
Ошибка возникает при вызове шаблонной функции из шаблонного класса. Решается эта проблема вот так:
C++
1
      Port::template SetConfig< Port::Fisrt >( );
aLarman
641 / 562 / 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
6917 / 4110 / 940
Регистрация: 30.01.2014
Сообщений: 6,905
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
641 / 562 / 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
6917 / 4110 / 940
Регистрация: 30.01.2014
Сообщений: 6,905
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++
Делаю типовую задачу с собеседованием - рекурсивный разворот односвязного списка. Сама функция работает, не могу довести до ума: void...

Переопределение методов - C++
Как вызвать переопределенный (не перегруженный) метод из производного класса? Base* obj_1 = new Der1; ...

Наследование методов - C++
Может мне стоит книжку почитать или получше подумать над структурой, но вопрос вот: Есть у нас древо классов: base &gt; s2 &gt; s3 &gt; s4 &gt; ......

Создание методов в С++ - C++
Всем привет подскажите можно ли обьвлять методы в С++ что бы они были доступны в файле реализации но не выносить их прототипы в хедер?

инкапсуляция методов - C++
можно ли в С ++ инкапсулировать методы? чтобы один метод был доступен только после вызова другого


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

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

Не по теме:

DrOffset, спс Вам

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru