Mentre sperimentavo un po 'con i template C++ sono riuscito a produrre questo semplice codice, per il quale l'output è diverso, di quanto mi aspettassi secondo le mie conoscenze sulle regole del C++.Ricerca del nome per nomi non dipendenti dal parametro del modello in VC++ 2008 Express. E 'un errore?
void bar(double d)
{
std::cout << "bar(double) function called" << std::endl;
}
template <typename T> void foo(T t)
{
bar(3);
}
void bar(int i)
{
std::cout << "bar(int) function called" << std::endl;
}
int main()
{
foo(3);
return 0;
}
Quando compilo questo codice in VC++ 2008 Express, la funzione viene chiamata bar(int)
. Questo sarebbe il comportamento, mi aspetterei se il bar(3);
nel corpo del modello dipendesse dal parametro del modello. Ma non lo è. La regola che ho trovato here dice "Lo standard C++ prescrive che tutti i nomi che non dipendono dai parametri del modello siano associati alle loro definizioni attuali quando analizzano una funzione o una classe template". Ho torto, che la "definizione attuale" di bar
quando si analizza la funzione modello foo
è la definizione di void bar(double d);
? Perché non è il caso se mi sbaglio. Non ci sono dichiarazioni anticipate di bar
in questa unità di compilazione.
Non sarebbe sorpreso se hai ragione. Mi sembra che l'implementazione di modelli di VC++ ignori completamente i problemi dipendenti/non dipendenti. – UncleBens
VC++ non ha mai rispettato la valutazione standard di 2 passaggi (il primo durante la lettura della definizione del modello e il secondo nell'istanza del modello). Salva dei caratteri 'typename' e' template' in alcuni punti ma ... non è conforme. –
Per motivi di precisione si fa riferimento alla sezione 14.6.3 Nomi non dipendenti [temp.nondep] dello standard. (Draft finale) – Francesco