Сообщение Специализация шаблона функции с параметром не-типом от 09.11.2018 18:01
Изменено 09.11.2018 21:37 Marty
Неумею я что-то в сабж.
Пытаюсь сделать
[ccode=что-то такое]#include <iostream>
using namespace std;
typedef struct {
unsigned v;
} GPIO_typedef;
#define PORTA ((GPIO_typedef*)0x04)
#define PORTB ((GPIO_typedef*)0x08)
template< GPIO_typedef* T >
inline
unsigned getPortFlag()
{
//static_assert(false, "not implemented for this target");
return 0;
}
template< >
inline
unsigned getPortFlag< PORTA >()
{
return 1;
}
int main() {
// your code goes here
cout<<"Port A flag: "<<getPortFlag<PORTA>()<<"\n";
cout<<"Port B flag: "<<getPortFlag<PORTB>()<<"\n";
return 0;
}
[/ccode]
В Keil'е получаю совсем невнятное сообщение, сейчас не приведу, а скинуть с работы забыл
В GCC немного попонятнее:
prog.cpp:22:10: error: template-id ‘getPortFlag<4u>’ for ‘unsigned int getPortFlag()’ does not match any template declaration
unsigned getPortFlag< PORTA >()
^~~~~~~~~~~~~~~~~~~~
prog.cpp:14:10: note: candidate is: template<GPIO_typedef* T> unsigned int getPortFlag()
unsigned getPortFlag()
^~~~~~~~~~~
prog.cpp: In function ‘int main()’:
prog.cpp:32:44: error: no matching function for call to ‘getPortFlag()’
cout<<"Port A flag: "<<getPortFlag<PORTA>()<<"\n";
^
prog.cpp:14:10: note: candidate: template<GPIO_typedef* T> unsigned int getPortFlag()
unsigned getPortFlag()
^~~~~~~~~~~
prog.cpp:14:10: note: template argument deduction/substitution failed:
prog.cpp:32:44: error: ‘4u’ is not a valid template argument for ‘GPIO_typedef*’ because it is not the address of a variable
cout<<"Port A flag: "<<getPortFlag<PORTA>()<<"\n";
^
Но всё равно что-то не догоняю, как правильно сделать.
И еще, похоже я не имею готовить static_assert — по задумке, если не нашлось нужной специализации, то он должен выстрелить, а он сразу стреляет. Хотя, это может из-за того, что со специализацией косяк
Неумею я что-то в сабж.
Пытаюсь сделать
что-то такое | |
| |
В Keil'е получаю совсем невнятное сообщение, сейчас не приведу, а скинуть с работы забыл
В GCC немного попонятнее:
prog.cpp:22:10: error: template-id ‘getPortFlag<4u>’ for ‘unsigned int getPortFlag()’ does not match any template declaration
unsigned getPortFlag< PORTA >()
^~~~~~~~~~~~~~~~~~~~
prog.cpp:14:10: note: candidate is: template<GPIO_typedef* T> unsigned int getPortFlag()
unsigned getPortFlag()
^~~~~~~~~~~
prog.cpp: In function ‘int main()’:
prog.cpp:32:44: error: no matching function for call to ‘getPortFlag()’
cout<<"Port A flag: "<<getPortFlag<PORTA>()<<"\n";
^
prog.cpp:14:10: note: candidate: template<GPIO_typedef* T> unsigned int getPortFlag()
unsigned getPortFlag()
^~~~~~~~~~~
prog.cpp:14:10: note: template argument deduction/substitution failed:
prog.cpp:32:44: error: ‘4u’ is not a valid template argument for ‘GPIO_typedef*’ because it is not the address of a variable
cout<<"Port A flag: "<<getPortFlag<PORTA>()<<"\n";
^
Но всё равно что-то не догоняю, как правильно сделать.
И еще, похоже я не имею готовить static_assert — по задумке, если не нашлось нужной специализации, то он должен выстрелить, а он сразу стреляет. Хотя, это может из-за того, что со специализацией косяк