2015-06-14 7 views
5

के रूप में उपयोग किया जाता है यदि मैं सही शिफ्ट ऑपरेटर का पता लेता हूं और इसे टेम्पलेट पैरामीटर के रूप में पास करता हूं, तो सही शिफ्ट प्रतीक टेम्पलेट पैरामीटर सूची के अंत के रूप में गलत तरीके से पढ़ा जा रहा है, और परिणामस्वरूप भ्रम कई त्रुटियों का कारण बन रहा है।सिंटैक्स त्रुटियों जब सही शिफ्ट ऑपरेटर को टेम्पलेट पैरामीटर

template <class T, void(T::*)(int)> struct TemplateMagic {}; 
struct TestStruct { void operator>> (int) {} }; 

int main() { 
//All the errors are on this line: 
    TemplateMagic<TestStruct, &TestStruct::operator>> >* ptr; 
} 

Windows डेस्कटॉप संस्करण 12.0.31101.00 अद्यतन 4 के लिए माइक्रोसॉफ्ट विजुअल स्टूडियो एक्सप्रेस 2013 में इस रनिंग निम्न त्रुटियों देता है:

त्रुटि C2143: सिंटेक्स त्रुटि: लापता ';' पहले '>'

त्रुटि C2275: 'TestStruct': एक अभिव्यक्ति

त्रुटि C2833 के रूप में इस प्रकार के अवैध उपयोग: 'ऑपरेटर>' किसी मान्यता प्राप्त ऑपरेटर या जहां तक ​​

टाइप नहीं है मैं बता सकता हूं, operator>> > प्रतीकों को तोड़ दिया जा रहा है, इसलिए इसे operator> के रूप में पढ़ा जाता है, इसके बाद टेम्पलेट तर्कों को बंद करने के लिए > को समाप्त करने और लुल्ज़ के लिए अतिरिक्त > के साथ समाप्त होता है। मुझे लगता है कि यह एक बग है।

क्या इसका पुन: प्रयास करने का कोई तरीका है, इसलिए इसे मान्य माना जाता है?

+0

क्या आपने इसे कंस्ट्रैसिस में डालने का प्रयास किया था: 'टेम्पलेटमैजिक <टेस्टस्ट्रक्चर, (और टेस्टस्ट्रक्चर :: ऑपरेटर >>)> * पीआरटी; '? –

उत्तर

3

बस &TestStruct::operator>> के आसपास कोष्ठक जोड़ना एमएसवीसी को सही तरीके से पार्स करने के लिए मजबूर करेगा।

इस कोड with MSVC 19.00.23008.0 संकलित:

template <class T, void(T::*)(int)> struct TemplateMagic {}; 
struct TestStruct { void operator>> (int) {} }; 

int main() { 
    TemplateMagic<TestStruct, (&TestStruct::operator>>) >* ptr; 
} 

कोष्ठकों जोड़ने कई स्थितियों में काम करेंगे जहां एक अभिव्यक्ति अस्पष्ट या संकलक द्वारा गलत समझा है की "चाल"।

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