Rozważmy następujący program w C++Dlaczego Argument Dependent Lookup nie działa z szablonem funkcji dynamic_pointer_cast
#include <memory>
struct A {};
struct B : A {};
int main()
{
auto x = std::make_shared<A>();
if (auto p = dynamic_pointer_cast<B>(x));
}
Podczas kompilacji z MSVC 2010, I uzyskać następujący błąd:
error C2065: 'dynamic_pointer_cast' : undeclared identifier
błąd nie ustępuje jeśli auto
zostanie zastąpiony przez std::shared_ptr<A>
. Kiedy w pełni kwalifikuję połączenie z std::dynamic_pointer_cast
, program pomyślnie się kompiluje.
Również gcc 4.5.1 nie podoba albo:
error: 'dynamic_pointer_cast' was not declared in this scope
Myślałem, że std::dynamic_pointer_cast
zostałby wybrany przez Koenig lookup, od rodzaju x
mieszka w przestrzeni nazw std
. Czego tu mi brakuje?
Co sprawia, że ** std :: dynamic_pointer_cast ** rzuca się? – DumbCoder
@DumbCoder: tak jak mówiłem, program kompiluje się, kiedy używam 'std :: dynamic_pointer_cast'. Po prostu ciekawi mnie, dlaczego kompilator nie wybiera "dynamic_pointer_cast" przez ADL. –
Przepraszam, że przepadła ta część, moja zła !! – DumbCoder