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);
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ć. –
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
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