miałem problem w niektórych kodu produkcyjnego że zminimalizowane do następnego testu:Co to jest wyszukiwanie nazw C++? (I jest GCC prawda?)
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 kompiluje tej grzywny. Zarówno z jak i bez -std=c++11
, 4,7 i 4,9 generowania komunikatów, takich jak:
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
Wszystkie poniższe trzy rzeczy spowoduje, że plik z powodzeniem kompilacji:
- Move
func(ns::type)
dons
nazw (pozwalającej ADL do znaleźć wns
) - Move
type
do globalnej przestrzeni nazw (ADL pozwala na znalezienie go w::
) - Pozbądź
intermediate
i nazywająfunc
bezpośrednio odfoo
więc ... co tu się dzieje? Czy GCC może odrzucić ten program? Dlaczego func
znaleziono przez niewykwalifikowane wyszukiwanie w trzecim wariancie (wywołanie func
bezpośrednio z foo
), ale nie znaleziono go przez niewykwalifikowane wyszukiwanie w oryginalnym wariancie w punkcie tworzenia?
Powinny być: (&& jest GCC prawe)? – Slava