Perché il seguente dare alcun errore di compilazione ?:Nessuna "ridefinizione dell'errore di parametro predefinito" per la funzione membro modello di classe?
// 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
}
Sembra come se il è solo silenziosamente ignorato dal compilatore. Perchè è questo?
La cosa interessante è che se la definizione del modello di classe è in Main.cpp anziché un file di intestazione, effettivamente ottengo il parametro predefinito ridefinizione errore.
Ora so che il compilatore si lamenterà di questo se fosse solo una funzione ordinaria (non di modello).
Che cosa dice lo standard sui parametri predefiniti nelle funzioni membro modello di classe o nei modelli funzione?
g ++ * fa * interrompe la compilazione con un errore. – sth
Quando si dice "... se la dichiarazione del modello è in ..." Suppongo si intenda la definizione del modello di classe, ad esempio "modello classe x {....};'. In tal caso, stai dicendo che sostituire la direttiva include con questa definizione di classe modello produce un messaggio del compilatore diverso? Ciò suggerisce che c'è qualcos'altro nel file di intestazione, cioè provare a copiare l'intero contenuto del file di intestazione nel punto in cui era presente la direttiva di inclusione e presumibilmente non si riceve alcun avvertimento sul compilatore? –
Troubadour
Potrebbe essere correlato in qualche modo a questo errore VC++: https://connect.microsoft.com/VisualStudio/feedback/details/496593/msdn-forum-splitting-templated-function-with-default-argument-into-declaration-definition -gives-compilation-error –