ho avuto un problema in un certo codice di produzione che ho ridotto al minimo al seguente test case:Cosa sta facendo la ricerca del nome in C++? (E ha ragione GCC?)
template<typename T>
void intermediate(T t)
{
func(t); // line 4 ("func not declared in this scope")
}
namespace ns {
struct type {};
}
void func(ns::type const & p); // line 11 ("declared here, later")
void foo(ns::type exit_node)
{
intermediate(exit_node); // line 15 ("required from here")
}
GCC 4.5 compila questo bene. Con e senza -std=c++11
, 4.7 e 4.9 produrre messaggi come:
test.cpp: In instantiation of ‘void intermediate(T) [with T = ns::type]’:
test.cpp:15:27: required from here
test.cpp:4:5: error: ‘func’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
test.cpp:11:6: note: ‘void func(const ns::type&)’ declared here, later in the translation unit
Tutte le seguenti tre cose farà sì che il file per compilare correttamente:
- Spostare
func(ns::type)
nellans
namespace (permettendo ADL a trovare inns
) - Spostare
type
nel namespace globale (permettendo ADL a trovare nel::
) - Sbarazzarsi della
intermediate
e chiamarefunc
direttamente dafoo
Quindi ... cosa sta succedendo qui? È legale per GCC respingere questo programma? Perché è func
trovato dalla ricerca non qualificata nella terza variante (chiamare func
direttamente da foo
) ma non trovato dalla ricerca non qualificata nella variante originale nel punto di istanziazione?
Dovrebbe essere: (&& è GCC a destra)? – Slava