¿Por qué no dar el siguiente error de compilación ?:¿No hay "redefinición de error de parámetro predeterminado" para la función de miembro de plantilla de clase?
// T.h
template<class T> class X
{
public:
void foo(int a = 42);
};
// Main.cpp
#include "T.h"
#include <iostream>
template<class T> void X<T>::foo(int a = 13)
{
std::cout << a << std::endl;
}
int main()
{
X<int> x;
x.foo(); // prints 42
}
Parece como si el se acaba en silencio ignorado por el compilador. ¿Por qué es esto?
Lo bueno es que si la definición de plantilla de clase está en Main.cpp en lugar de un archivo de cabecera, de hecho obtengo el error de redefinición del parámetro error.
Ahora sé que el compilador se quejará de esto si fuera una función normal (sin plantilla).
¿Qué dice el estándar sobre los parámetros predeterminados en las funciones de los miembros de la plantilla de clase o en las plantillas de funciones?
g ++ * does * cancela la compilación con un error. – sth
Cuando dices "... si la declaración de la plantilla está en ...", supongo que te refieres a la definición de la plantilla de clase, es decir, 'plantilla clase x {....};'. Si es así, ¿está diciendo que reemplazar la directiva de inclusión con esta definición de clase de plantilla produce un mensaje de compilador diferente? Eso sugiere que hay algo más en el archivo de encabezado, es decir, intente copiar todo el contenido del archivo de encabezado en donde estaba la directiva de inclusión y, presumiblemente, ¿entonces no recibe ninguna advertencia del compilador? –
Troubadour
Podría estar relacionado de alguna manera con este error de VC++: https://connect.microsoft.com/VisualStudio/feedback/details/496593/msdn-forum-splitting-templated-function-with-default-argument-into-declaration-definition -gives-compilation-error –