Qualcuno potrebbe spiegare come risolvere l'ambiguo avviso di sovraccarico per make_unique, da dove viene l'errore e cosa significa esattamente (capisco cosa sia un sovraccarico ambiguo è ma non sono sicuro perché ne ottengo uno per questo particolare codice)? Sto usando C++ 11, quindi uso il modello raccomandato da Herb Sutter.C++ 11/14 make_unique sovraccarico ambiguo per std :: string
Utilizzando io ottenere il seguente errore:
Error 4 error C2668: 'make_unique' : ambiguous call to overloaded function
E il mouse sopra tooltip in Visual Studio 13 mi dà il seguente ai metodi:
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
Il secondo dovrebbe essere quello chiamato dal modello 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)...));
}
Il costruttore da inoltrare a:
Shader(const std::string& name);
Il codice che genera l'errore
std::string _name = "Shader";
std::unique_ptr<Shader> s = make_unique<Shader>(_name);
Buona cattura. Ma la domanda rimanente è perché VS vede entrambi come candidati. Probabilmente OP ha usato 'using namespace std;'? Quale è un'altra cosa che OP dovrebbe risolvere. –
Questa è stata la mia prima ipotesi e ho scansionato tutti i file per l'utilizzo di namespace std; Purtroppo questo non è il problema :( Non c'è più alcun namespace per qualsiasi namespace, e non capisco perché VS veda il metodo C++ 14 :) Mi manca qualcosa o è possibile che usi la versione std anche se non si usa più lo spazio dei nomi? Sono abbastanza sicuro che la risposta sia corretta, ma aspetto l'approvazione finché qualcuno non trova o spiega perché viene utilizzato il metodo C++ 14. – NoxMortem
Ok, la risposta è sicuramente corretta come: make_unique (_nome) lo risolve. Rimane ancora la piccola domanda in più per cui VS vede il metodo C++ 14 senza dare lo spazio dei nomi. Un'altra domanda, se uso semplicemente i metodi C++ 14, ci sono alcune cose di cui ho bisogno di essere a conoscenza oltre a quello che ovviamente ha bisogno di un compilatore capace di C++ 14 per costruire il progetto? –
NoxMortem