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.