2015-02-15 17 views
6

के लिए एंबिकिट ओवरलोड लोड करें क्या कोई कृपया मेक_निक के लिए महत्वाकांक्षी ओवरलोड चेतावनी को हल करने का तरीका बता सकता है, जहां त्रुटि आती है और इसका क्या अर्थ है (मुझे समझ में आता है कि एक असाधारण अधिभार क्या है लेकिन मुझे यकीन नहीं है कि मुझे इस विशेष कोड के लिए क्यों मिलता है)? मैं C++ 11 का उपयोग कर रहा हूं, इसलिए मैं हर्ब सटर से अनुशंसित टेम्पलेट का उपयोग करता हूं।सी ++ 11/14 make_unique std :: स्ट्रिंग

इसका इस्तेमाल करते हुए मैं निम्नलिखित त्रुटि मिलती है:

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

और विजुअल स्टूडियो 13 में टूलटिप से अधिक मंडराना मुझे देता है तरीकों के लिए निम्न:

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 

दूसरा एक एक बुलाया जाना चाहिए 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)...)); 
} 

निर्माता को अग्रेषित करने के लिए:

Shader(const std::string& name); 

कोड त्रुटि

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

उत्तर

3

कॉल अस्पष्ट है क्योंकि आप, std::make_unique है के रूप में टूलटिप सामग्री आप बोली द्वारा दिखाए करना पैदा होता है। और भले ही आपने std:: नहीं लिखा था, क्योंकि आप std::stringargument-dependent lookup kicks in to search that namespace automatically पास कर रहे हैं।

जब आप कहते हैं कि "मैं सी ++ 11 का उपयोग कर रहा हूं", यह बिल्कुल सही नहीं है, क्योंकि विजुअल स्टूडियो आपको यह चुनने नहीं देता कि कौन सा मानक लिखना है। यह आपको केवल नवीनतम समर्थन प्रदान करता है जो इसे किसी के लिए जरूरी है दिया गया फीचर और जाहिर है, विजुअल स्टूडियो 2013 में सी ++ 14 का std::make_unique है।

अपना हटाएं।

+0

अच्छा पकड़। लेकिन शेष सवाल यह है कि वीएस उम्मीदवारों के रूप में क्यों देखता है। ओपी शायद 'नेमस्पेस std;' का उपयोग कर इस्तेमाल किया? ओपी को एक और चीज ठीक करनी चाहिए। –

+0

यह मेरा पहला अनुमान था और मैंने नेमस्पेस std का उपयोग करने के लिए सभी फ़ाइलों को स्कैन किया है; अफसोस की बात यह समस्या नहीं है :( अब किसी भी नामस्थान के लिए नेमस्पेस का उपयोग नहीं किया जा रहा है, और मुझे नहीं पता कि वीएस सी ++ 14 विधि क्यों देखता है :) क्या मुझे कुछ याद आ रही है या क्या यह संभव है कि यह std संस्करण का उपयोग करे अभी तक नामस्थान का उपयोग नहीं कर रहा है? मुझे पूरा यकीन है कि उत्तर स्वयं सही है, लेकिन जब तक कोई व्यक्ति पाता है या बताता है कि सी ++ 14 विधि का उपयोग क्यों किया जाता है, तब तक मैं अनुमोदन की प्रतीक्षा करता हूं। – NoxMortem

+1

ठीक है, उत्तर निश्चित रूप से सही है :: make_unique (_name) इसे हल करता है। अभी भी अतिरिक्त सवाल है कि वीएस नामस्थान के बिना सी ++ 14 विधि क्यों देखता है। एक और सवाल, यदि मैं बस सी ++ 14 विधियों का उपयोग करता हूं, तो क्या ऐसी कुछ चीजें हैं जिनके बारे में मुझे अवगत होना चाहिए, इसके लिए परियोजना को बनाने के लिए स्पष्ट रूप से एक सी ++ 14 सक्षम कंपाइलर की आवश्यकता है? – NoxMortem

-1

ऐसा लगता है कि दृश्य स्टूडियो में ऐसा करना संभव नहीं है।

यह एक बग है।

इस प्रश्न के अनुसार, आपकी सबसे अच्छी शर्त How to Detect if I'm Compiling Code With Visual Studio 2008? है, ऐसे मामलों को संभालने के लिए विभिन्न #ifdefs का उपयोग करना जारी रखें जहां दृश्य स्टूडियो अभी भी बुनियादी सुविधाओं का समर्थन करने में सक्षम होने के लिए बहुत बकवास है।

उपयोग:

#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

नहीं, यह एक बग नहीं है, और मैंने दिखाया कि आप इसे कैसे कर सकते हैं। क्या आपने मेरा जवाब पढ़ा? क्या आप वह व्यक्ति हैं जिन्होंने आज इसे कम किया? क्यूं कर? –

+0

@LightnessRacesinOrbit यह एक बग है। make_unique std ::, उदाहरण के लिए किसी भी वर्ग पर इसका उपयोग किए बिना हल करता है। make_unique () अभी भी std :: make_unique का उपयोग कर हल करेगा। यह एक बग नहीं है? (ध्यान दें कि विशेष रूप से क्लैंग इसे सही तरीके से हल करता है। यह केवल दृश्य स्टूडियो है जो समस्याग्रस्त है) – Doug

+1

यदि 'make_unique ()' में एक बग है तो यह _some अन्य मुद्दा पूरी तरह से _ है। प्रश्न फिर से पढ़ें। यह 'make_unique (_name) 'है जहां' _name' एक 'std :: string' है। एडीएल में शामिल है। यह 100% मानक व्यवहार है। इस सवाल की बात यह है कि एक बग नहीं है। यदि आपको कोड_ के कुछ अन्य टुकड़े में एक बग मिला है तो यह बहुत अच्छा है लेकिन इससे "यह एक बग" नहीं है जो इस प्रश्न का सही उत्तर देता है। यह! –

संबंधित मुद्दे