2015-02-15 18 views
6

Czy ktoś mógłby mi wyjaśnić, jak rozwiązać niedoskonałe ostrzeżenie o przeciążeniu dla make_unique, skąd bierze się błąd i co dokładnie oznacza (rozumiem, co to jest nadmierne przeciążenie jest, ale nie jestem pewien, dlaczego dostaję jeden dla tego konkretnego kodu)? Używam C++ 11, dlatego używam zalecanego szablonu od Herb Sutter.C++ 11/14 make_unique Niewielkie przeciążenie dla std :: string

Używanie go pojawia się następujący błąd:

Error 4 error C2668: 'make_unique' : ambiguous call to overloaded function 

a Najedź podpowiedzi w Visual Studio 13 daje mi następujących metod:

function template "std::enable_if<!std::is_array<_Ty>::value, std::unique_ptr<_Ty,std::default_delete<_Ty>>>::type std::make_unique<_Ty,_Types...>(_Types &&..._Args)" 
function template "std::unique_ptr<T, std::default_delete<T>> make_unique<T,Args...>(Args...) 
argument types are: std::string 

Drugi powinien być jeden o nazwie z szablonu make_unique

/* Will be part of c++14 and is just an oversight in c++11 
* From: http://herbsutter.com/gotw/_102/ 
*/ 
template<typename T, typename ...Args> 
std::unique_ptr<T> make_unique(Args&& ...args){ 
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); 
} 

Konstruktor do przekazania do:

Shader(const std::string& name); 

Kod generowania błędu

std::string _name = "Shader"; 
std::unique_ptr<Shader> s = make_unique<Shader>(_name); 

Odpowiedz

3

wywołanie jest niejednoznaczna, ponieważ zrobić mieć std::make_unique, jak wynika z treści tooltip cytujesz. I nawet jeśli nie napisałeś std::, ponieważ przekazujesz std::stringargument-dependent lookup kicks in to search that namespace automatically.

Kiedy mówisz "Używam C++ 11", to nie jest do końca słuszne, ponieważ Visual Studio nie pozwala ci wybrać, który standard pisać. Po prostu zapewnia ci najnowsze wsparcie, które zebrał dla każdego podana funkcja. I, najwyraźniej, Visual Studio 2013 ma C++ 14 std::make_unique.

Usuń swoje.

+0

dobry połów. Pozostaje jednak pytanie, dlaczego VS postrzega oba jako kandydatów. OP prawdopodobnie użył 'using namespace std;'? Co jest kolejną rzeczą, którą OP powinien naprawić. –

+0

To był mój pierwszy domysł i przeskanowałem wszystkie pliki pod kątem używania przestrzeni nazw std; Niestety nie jest to problem :( Nie ma już przestrzeni nazw dla żadnej przestrzeni nazw i nie rozumiem dlaczego VS widzi metodę C++ 14 :) Czy brakuje mi czegoś lub jest to możliwe, że używa wersji standardowej chociaż nie ma już przestrzeni nazw? Jestem pewien, że sama odpowiedź jest poprawna, ale czekam na zatwierdzenie, dopóki ktoś nie znajdzie lub nie wyjaśni, dlaczego użyto metody C++ 14. – NoxMortem

+1

OK, odpowiedź z pewnością jest poprawna, ponieważ :: make_unique (_name) rozwiązuje problem. Nadal pozostaje małe pytanie, dlaczego VS nie widzi metody C++ 14 bez podania przestrzeni nazw. Kolejne pytanie, czy po prostu korzystam z metod C++ 14, czy są pewne rzeczy, o których muszę wiedzieć, oprócz tego, oczywiście, że potrzebny jest kompilator w stylu C++ 14 do zbudowania projektu? – NoxMortem

-1

Wygląda na to, że nie można tego zrobić w studiu graficznym.

To błąd.

Najlepszym rozwiązaniem jest, zgodnie z tym pytaniem, How to Detect if I'm Compiling Code With Visual Studio 2008?, nadal używać różnych #ifdefs do obsługi przypadków, w których wizualne studio jest nadal zbyt bzdurne, aby móc obsługiwać podstawowe funkcje.

Zastosowanie:

#if (_MSC_VER == 1500) 
    // ... Do VC9/Visual Studio 2008 specific stuff 
#elif (_MSC_VER == 1600) 
    // ... Do VC10/Visual Studio 2010 specific stuff 
#elif (_MSC_VER == 1700) 
    // ... Do VC11/Visual Studio 2012 specific stuff 
#endif 
+1

Nie, to nie jest błąd i pokazałem, jak możesz to zrobić. Czy przeczytałeś moją odpowiedź? Czy jesteś osobą, która dzisiaj go przyjęła? Czemu? –

+0

@LightnessRacesinOrbit To jest błąd. make_unique rozwiązuje się bez używania go na żadnej klasie w std ::, np. make_unique () będzie nadal rozwiązywać za pomocą std :: make_unique. Jak to nie jest błąd? (Zwróć uwagę, że clang rozwiązuje to poprawnie, to tylko wizualne studio, które jest problematyczne) – Doug

+1

Jeśli 'make_unique ()' ma błąd to jest to inny problem całkowicie_. Przeczytaj ponownie pytanie. Chodzi o 'make_unique (_name)' gdzie '_name' jest' std :: string'. ADL wkracza. To standardowe zachowanie w 100%. To, o co pyta, nie jest błędem. Jeśli znalazłeś błąd w _some innym kawałku kodu, to świetnie, ale to nie sprawia, że ​​"to błąd" jest poprawną odpowiedzią na to pytanie. To nie jest! –

Powiązane problemy