una tipos que programas programación programacion programa personales muestre hacer datos como básicos basica aplicacion c++ language-lawyer c++14 template-specialization variable-templates

tipos - programacion en c++



Advertencia de C++ 14: demasiados encabezados de plantilla para la variable(debe ser 0) (1)

Mientras experimentaba con el reciente compilador g ++ - 5, escribí la siguiente declaración en un archivo:

template<T> T a; template<> int a = 1;

Lo que resulta en:

advertencia: demasiados encabezados de plantilla para a (debería ser 0)

También efectivamente, realmente no se especializa a<int> . p.ej

template<typename T> T a; template<> int a = 1; int main () { std::cout << a<double> << "/n"; // prints 0; OK std::cout << a<int> << "/n"; // prints 0! why not 1? }

¿Cuál es el misterio de esta sintaxis?


Los argumentos de plantilla solo se pueden omitir en la especialización explícita de plantillas de función . Tiene una plantilla de variable, por lo que debe incluir la <int> :

template<> int a<int> = 1;

Citando C ++ 14 (n4140), 14.7.3 / 10 (énfasis mío):

Un argumento-plantilla final se puede dejar sin especificar en el id-plantilla nombrando una especialización de plantilla de función explícita siempre que se pueda deducir del tipo de argumento de función.

Si no desea repetir el tipo, puede usar auto :

template<> auto a<int> = 1;

[Ejemplo en vivo] usando Clang.

Hay que tener en cuenta una cosa: cuando se usa auto , el tipo de la variable especializada se deducirá del inicializador, no del argumento de la plantilla. Y dado que una especialización puede tener un tipo diferente al de la plantilla principal, el compilador la aceptará con gusto incluso si difieren.