2012-11-17 2 views
12

विजुअल स्टूडियो 2010 और विजुअल स्टूडियो 2012 इस कोड को संकलित करने में विफल क्यों होता है?विजुअल स्टूडियो बूलियन ऑपरेशंस के संदर्भ में कास्ट (रूपांतरण) ऑपरेटर टेम्पलेट (टी = बूल) को तुरंत चालू करने में विफल रहता है

Codepad.org, Xcode, जीसीसी, LLVM, बजना सब कोई समस्या नहीं है, लेकिन दृश्य स्टूडियो बिस्तर poops:

struct S { 
    template <class T> inline operator T() const { return T(); } 
}; 
int main() { 
    // NOTE: "S()" denotes construction in these examples 
    struct F { 
    void operator() (bool) { } 
    static void toint (int) { } 
    static void tostr (char const*) { } 
    }; 
    bool b1 = S(); // Okay 
    bool b2 (S()); // Okay 
    F() (S()); // Okay 
    F::toint (S());// Okay 
    F::tostr (S());// Okay 

    S() || false; // Error: error C2676: binary '||' : 'vf::S' does 
        // not define this operator or a conversion to a type 
        // acceptable to the predefined operator 
    return 0; 
} 

explicit कीवर्ड को जोड़ने का जीसीसी या बजना के लिए एक बात नहीं बदलता है। त्रुटि का उत्पादन संदेश है:

error C2676: binary '||' : 'S' does not define this operator or a 
    conversion to a type acceptable to the predefined operator 
+8

और त्रुटि संदेश है ...? – ybungalobill

+1

आप वहां कास्ट चिपक सकते हैं। – chris

+0

* यह * क्या करना चाहिए? –

उत्तर

0

आप बूलियन के लिए निहित typecasting forbit हैं, तो संकलक अगर वहाँ एक ऑपरेटर है की जाँच करने के है || परिभाषित wich एक बुलियन लेता है। यह (उम्मीद है!) परिभाषित नहीं है क्योंकि यह शॉर्टकट तोड़ देगा। इसलिए उसे यह जांचना है कि कोई रूपांतरण-ऑपरेटर परिभाषित किया गया है जो इसे वैश्विक || -operator के लिए परिभाषित करता है। क्या आप एक समस्या-ऑपरेटर को बूल, बूल या int में जोड़कर इस समस्या को हल कर सकते हैं (जो वही है ^^) ...?

operator bool() {return this != null && this != 0xcccccccc;}

यह BTW सिर्फ एक हैक हो सकता है, यह बेहतर होगा एक तार्किक सार्थक रूपांतरण प्रदान करने के लिए होगा।

Im shure वहाँ 0xcccccccc के लिए निरंतर परिभाषित किया गया है जो डीबग मोड में अनियमित स्मृति को चिह्नित करता है, लेकिन मुझे यह नहीं पता।

+1

यह कामकाज नमूना कोड को ठीक करेगा लेकिन अभ्यास में प्रयोग योग्य नहीं है। प्रश्न में वर्ग एक लुआ प्रकार का प्रतिनिधित्व करता है, जो 11 अलग-अलग वास्तविक प्रकारों में से किसी एक को ले सकता है। अगर मैं बूल, int, डबल, स्ट्रिंग इत्यादि के लिए रूपांतरण ऑपरेटर प्रदान करना चाहता था ... तो वहां संदिग्ध रूपांतरण होंगे। यही कारण है कि मैंने टेम्पलेट का इस्तेमाल किया। टेम्पलेट टी डाली() और यह स्पष्ट रूप से कहते हैं: केवल वास्तविक समाधान का एक समारोह प्रदान करना है। –

3

यह एक बग है, कम से कम सी ++ 03 में (सी ++ 11 के बारे में निश्चित नहीं है)।

सी में अधिभार संकल्प नियमों ++ 03 §13.3.1.2, निर्मित || ऑपरेटर, चयन किया जाता है के बाद से कोई उपयोगकर्ता परिभाषित || ऑपरेटर S के लिए परिभाषित किया गया है के अनुसार।

§5.15/1 का कहना है:

|| ऑपरेटर समूहों बाएँ-से-सही। ऑपरेंड दोनों को स्पष्ट रूप से bool (खंड 4) में परिवर्तित कर दिया गया है। [...]

§12.3/2 का कहना है:

उपयोगकर्ता-परिभाषित रूपांतरण लागू होते हैं केवल जहां वे स्पष्ट (10.2, 12.3.2) कर रहे हैं। [...]

§12.3/5:

उपयोगकर्ता-परिभाषित रूपांतरण परोक्ष उपयोग किया जाता है केवल अगर वे स्पष्ट कर रहे हैं। [...] फ़ंक्शन ओवरलोड रिज़ॉल्यूशन (13.3.3) रूपांतरण करने के लिए सर्वोत्तम रूपांतरण फ़ंक्शन का चयन करता है।

§13.3.2/3:

दूसरा, F एक व्यवहार्य समारोह होने के लिए, वहाँ प्रत्येक तर्क के लिए मौजूद होगा एक अंतर्निहित रूपांतरण अनुक्रम (13.3.3.1) है कि करने के लिए है कि तर्क धर्मान्तरित F के संबंधित पैरामीटर।

जाहिर Sbool के लिए एक उपयोगकर्ता-निर्धारित रूपांतरण परिभाषित करता है।अंतर्निहित || ऑपरेटर ओवरलोड रिज़ॉल्यूशन के लिए एक व्यवहार्य कार्य है, और चूंकि यह केवल एकमात्र है, यह सबसे अच्छा है। तो अभिव्यक्ति अच्छी तरह से बनाई गई है।

नोट के

इसके अलावा §4/3, जो कहते हैं है:

कोई व्यंजक e परोक्ष एक प्रकार T में बदला जा सकता यदि और केवल यदि घोषणा "T t=e;" अच्छी तरह से बनाई है, कुछ का आविष्कार के लिए अस्थायी चर t (8.5)। [...]

तो मैं उत्सुक हूं कि विजुअल स्टूडियो bool b = S(); कथन के लिए भी त्रुटि उत्पन्न करता है या नहीं।

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