2017-10-10 16 views
8

टुकड़ा MSVC सी में संकलन नहीं करता ++ (2015, 2017) के बाद:खाका तर्क नाम टक्कर

template <typename Type> 
struct Base : public Type 
{ 
    Base(const Type & type) 
    : Type(type) 
    {} 
}; 

struct SomeType 
{ 
    int Type() { return 42; } 
}; 

struct Wrong : public Base<SomeType> 
{ 
    Wrong(const SomeType & type) 
    : Base<SomeType>(type) 
    {} 
}; 

SomeType some; 
Wrong wrong(some); 

संकलक भ्रमित और के Type() विधि के लिए एक कॉल के साथ Type निर्माता बुला की व्याख्या कर रहा है कक्षा से मैं प्राप्त करने की कोशिश करता हूं। जीएनयू सी ++ कंपाइलर कोड के साथ कोई समस्या नहीं है।

टेम्पलेट तर्क का नाम बदलना कुछ अलग करने के लिए बेस क्लास घोषणा में टाइप करें (आधार वर्ग की किसी भी विधि के साथ टकराव में नहीं) समस्या हल करती है। : (typename Type)(type) जैसे कुछ जोड़ने से मदद नहीं मिलती है।

क्या यह एमएसवीसी सी ++ कंपाइलर का एक बग है। इस तरह की समस्याओं को हल करने के लिए कोई सुझाव?

+2

यह एक अजीब स्थिति है। +1 – StoryTeller

+1

ऐसा लगता है कि यह वीएस में दो चरण लुकअप के लिए उचित समर्थन की कमी के कारण हो सकता है। सोचा [वीएस टीम इस पर काम कर रही है] (https://blogs.msdn.microsoft.com/vcblog/2017/09/11/two-phase-name-lookup-support-comes-to-msvc/)। नामकरण सम्मेलन का उपयोग करके इस तरह की समस्याओं से बचा जा सकता है जो फ़ंक्शन नामों, प्रकारों के नाम, परिवर्तनीय नाम आदि के लिए नामों की विभिन्न शैली की मांग करता है। – VTT

उत्तर

9

यह एमएसवीसी ++ में एक बग है। टेम्प्लेट परिभाषा के दौरान टेम्पलेट पैरामीटर के नाम के रूप में हल करने के लिए दो चरण चरण देखने के लिए Type की आवश्यकता है!

तथ्य यह है कि तत्कालता के समय ऐसे सदस्य को हस्तक्षेप नहीं करना चाहिए। जब टेम्पलेट सही ढंग से लागू होते हैं, तो यह नहीं है, जैसा कि आपने जीसीसी के साथ नोट किया था।

लेकिन माइक्रोसॉफ्ट ने इसे सही ढंग से लागू नहीं किया until recently। उनके कार्यान्वयन में, एक टेम्पलेट एक मैक्रो की तरह व्यवहार करता है, जो त्रुटि का कारण है।

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