2017-05-05 16 views
8

Występuje problem z gcc z C++ 14. Podczas kompilacji kodu poniżej pojawia się błądWyszukiwanie argumentu w C++

"call of overloaded ‘make_unique(std::__cxx11::string)’ is ambiguous" 

Jednak jeśli usunąć lokalną definicję make_unique ja też pojawia się błąd:

"‘make_unique’ was not declared in this scope" 

wydaje się, że powinno to być niemożliwe, aby oba te błędy, ponieważ albo std :: make_unique jest wciągana z powodu ADL, albo nie. Czy to tylko problem z gcc, czy jest coś innego?

Dla odniesienia sub-code make_unique dla funkcji szablonowej innej niż szablon (np. Pozycja) pozbywa się błędu "nie jest zadeklarowany w tym zakresie", co prowadzi mnie do przekonania, że ​​jest to problem z gcc.

#include <string> 
#include <memory> 

template <typename T, typename... Args> 
inline std::unique_ptr<T> make_unique(Args&&... args) 
{ 
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); 
} 

struct A 
{ 
    A(std::string a){ } 
}; 

int main() 
{ 
    auto a = make_unique<A>(std::string()); 
} 
+1

FWIW, clang i MSVS2017 również odrzucają kod z tego samego powodu. – NathanOliver

+2

Dziwne ... Myślałem, że ADL nie ma zastosowania do wywołań z jawnymi argumentami szablonu? – ildjarn

+0

Patrz [P0389R0] (http://wg21.link/p0389r0). – cpplearner

Odpowiedz

4

To nie jest błąd.

Bez lokalnej definicji szablonu,

make_unique<A>(std::string()); 

nie mamy definicję szablonu make_unique dostępnych i mamy tak

(make_unique < A) > (std::string()); 

Z definicji mamy definicję szablonu i tak, my może używać zwykłego ADL.

Powiązane problemy