Информация об изменениях

Сообщение Специализация шаблона функции с параметром не-типом от 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 — по задумке, если не нашлось нужной специализации, то он должен выстрелить, а он сразу стреляет. Хотя, это может из-за того, что со специализацией косяк
Специализация шаблона функции с параметром не-типом
Здравствуйте!

Неумею я что-то в сабж.
Пытаюсь сделать
  что-то такое
#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;
}

В 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 — по задумке, если не нашлось нужной специализации, то он должен выстрелить, а он сразу стреляет. Хотя, это может из-за того, что со специализацией косяк