2017-05-05 5 views
8

में तर्क लुकअप सी ++ 14 के साथ जीसीसी के साथ किसी समस्या में चल रहा है।सी ++

"‘make_unique’ was not declared in this scope" 

ऐसा लगता है जैसे कि यह इन दोनों को प्राप्त करने के लिए असंभव होना चाहिए: जब कोड संकलन नीचे मैं एक त्रुटि

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

मिल लेकिन अगर मैं make_unique के स्थानीय परिभाषा को दूर मैं भी कोई त्रुटि मिलती है एडीएल के कारण या तो std :: make_unique के रूप में त्रुटियों को खींचा जाता है या नहीं। क्या यह सिर्फ जीसीसी के साथ एक मुद्दा है या क्या कुछ और चल रहा है?

संदर्भ के लिए एक गैर-टेम्पलेट std फ़ंक्शन (जैसे stoi) के लिए make_unique subbing के लिए "इस दायरे में घोषित नहीं किया गया" त्रुटि से छुटकारा पाता है जो मुझे विश्वास दिलाता है कि यह जीसीसी के साथ एक मुद्दा है।

#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

एफडब्ल्यूआईडब्ल्यू, क्लैंग और एमएसवीएस2017 भी इसी कारण से कोड को अस्वीकार करते हैं। – NathanOliver

+2

अजीब ... मैंने सोचा कि एडीएल स्पष्ट टेम्पलेट तर्कों के साथ कॉल पर लागू नहीं हुआ है? – ildjarn

+0

देखें [पी 038 9आर 0] (http://wg21.link/p0389r0)। – cpplearner

उत्तर

4

यह एक बग नहीं है।

अपने स्थानीय टेम्पलेट परिभाषा के बिना,

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

हम make_unique उपलब्ध की टेम्पलेट परिभाषा नहीं है और हम अपनी परिभाषा के साथ इतना

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

है, हम टेम्पलेट परिभाषा है और हां, तो हम नियमित एडीएल का उपयोग कर सकते हैं।