Il seguente codice compila in Visual C++ 2013, ma non sotto G ++ 4.8.2:Elaborazione di funzioni template istanziati
template<class T>
int MyFunc(T& t)
{
return static_cast<int>(CCodes::blah);
}
template<>
int MyFunc(float& t)
{
return 0;
}
int main() {
float f = 10.f;
return MyFunc(f);
}
Visual C++ sembra ignorare la funzione generale del modello, perché solo la specializzazione MyFunc<float>
viene utilizzato. G ++ analizza comunque la funzione generale e rileva che l'enumerazione CCodes non è stata definita.
Quale è giusto? O è questa implementazione definita?
In entrambi i casi, il codice non valido è ancora codice malformato. –
Quindi immagino che la mia domanda possa essere riformulata: questo codice è malformato? O il compilatore è autorizzato a non analizzare definizioni di modelli non confermate? – Tom
@Tom Cosa succede se scrivi 'return static_cast (CCodes :: blah);'? –