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

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

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

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

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

Использование переборных методов - 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 может быть либо вне либо внутри ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
aLarman
642 / 563 / 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
0
SergMic
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 4
03.02.2014, 13:38  [ТС] #3
GPIOA->ODR это глобальная переменная, регистр в микроконтроллере. Для управления которой все и создавалось. Компилятор Keil.
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
03.02.2014, 13:48 #4
а Вы уверены что в нем поддерживаются шаблоны?
0
SergMic
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 4
03.02.2014, 15:50  [ТС] #5
Конечно уверен))) Т.к. конструкция D::SetConfig<D::Fisrt>( ) работает.

Добавлено через 1 час 43 минуты
Только начинаю писать на С++. Не разочаровывайте меня)))) Посчитаю, что знающих С++ просто нет и не у кого учится)))
0
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
03.02.2014, 16:04 #6
Ошибка возникает при вызове шаблонной функции из шаблонного класса. Решается эта проблема вот так:
C++
1
      Port::template SetConfig< Port::Fisrt >( );
1
aLarman
642 / 563 / 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'

0
DrOffset
7155 / 4296 / 972
Регистрация: 30.01.2014
Сообщений: 7,101
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++ вообще не критерий.
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
03.02.2014, 16:14 #9
Цитата Сообщение от DrOffset Посмотреть сообщение
А собираемость кода в VC++ вообще не критерий
хорошо, раз это часть стандарта, чтож эта зараза молчит (
0
SergMic
0 / 0 / 0
Регистрация: 03.02.2014
Сообщений: 4
03.02.2014, 16:29  [ТС] #10
Спасибо))) И отдельное спасибо за разъяснения сути) Это как раз то что хотел... понять суть)
0
DrOffset
7155 / 4296 / 972
Регистрация: 30.01.2014
Сообщений: 7,101
03.02.2014, 16:37 #11
Цитата Сообщение от aLarman Посмотреть сообщение
хорошо, раз это часть стандарта, чтож эта зараза молчит (
В VC++ подругому реализована обработка шаблонов. Там отсутствует так называемый two phase lookup, который требуется стандартом. В студии построение AST для шаблоного кода откладывается до момента инстанцирования, когда уже понятно какие типы будут подставлены. Соответственно отличить шаблон от нешаблона VС++ в вышеупомянутом прекрасно может. GCC сразу пытается построить AST, но на этом этапе типы еще неизвестны, потому нужна подсказка. Насчет two phase lookup тема холиварная, много споров нужен он или нет, но у него есть неоспоримое преимущество: ошибку в шаблонном коде можно сразу распознать, в VC++ же в шаблоне можно написать всякую ахиненю, до первой инстанции он и носом не поведет, чтобы сказать об этом.

В VС++ это сделано сознательно, потому что при таком подходе очень сильно ускоряется обработка файлов с шаблонным кодом, который написан, но не инстанцирован.
1
aLarman
03.02.2014, 16:47     Использование шаблоных методов
  #12

Не по теме:

DrOffset, спс Вам

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2014, 16:47
Привет! Вот еще темы с ответами:

Использование private-членов класса в сигнатуре методов - C++
Делаю типовую задачу с собеседованием - рекурсивный разворот односвязного списка. Сама функция работает, не могу довести до ума: void...

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

Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе работу этих методов - C++
Реализация методов класса. Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе...

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


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

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

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