2013-01-16 19 views
13

नीचे दिए गए कोड में, यदि एक अस्पष्टता के कारण एक से अधिक कास्ट ऑपरेटर परिभाषित किया गया है तो मैं एक कंपाइलर त्रुटि प्राप्त करने की अपेक्षा करता हूं।ओवरलोडेड कास्ट ऑपरेटरों की प्राथमिकता

#include <iostream> 
#include <sstream> 

struct A 
{ 
    operator const char*() { return "hello world\n"; } 
    operator float()  { return 123.0F; } 
    //operator int()   { return 49; } 
}; 

int main() 
{ 
    A a; 
    std::stringstream ss; 
    ss << a; 
    std::cout << ss.str(); 
    return 0; 
} 

इसके बजाय, जब तक केवल एक ही सांख्यिक डाली ऑपरेटर परिभाषित किया गया है तो यह कोई त्रुटि है, कोई चेतावनी के साथ संकलित, और संख्यात्मक डाली operator const char *() वरीयता में प्रयोग किया जाता है। घोषित ऑपरेटरों का आदेश कोई फर्क नहीं पड़ता।

लेकिन अगर operator int() और operator float() दोनों तो परिभाषित कर रहे हैं मैं मैं क्या शुरू से ही उम्मीद:

'operator <<' is ambiguous

वहाँ डाले के लिए पूर्वता नियम हैं, या क्यों संकलक डिफ़ॉल्ट रूप से संख्यात्मक कलाकारों का चयन करता है? मैं समझता हूं कि मुझे स्पष्ट रूप से बताएं कि मेरा कौन सा कास्ट मतलब है, लेकिन मेरा प्रश्न संकलक बनाता है डिफ़ॉल्ट विकल्प पर है।


संपादित करें: कंपाइलर एमएसवीसी 2010

+0

मैं एक प्राथमिकता पर भरोसा नहीं करता। टाइप करें जिसका मतलब है। बस एक स्पष्ट कास्ट का उपयोग करें। 'ss << static_cast (ए);' – andre

+0

मैंने आपका उदाहरण संकलित किया है और g ++ मुझे "त्रुटि: ऑपरेटर के लिए अस्पष्ट अधिभार << 'एसएस << ए' में देता है। तो, कम से कम g ++ अपेक्षित के रूप में काम कर रहा है। –

+1

ऐसा लगता है कि यह संकलक निर्भर है। आप किस कंपाइलर का उपयोग कर रहे हैं? – SztupY

उत्तर

4

रूपांतरणों को C++ मानक के § 13.3.3.1 के अनुसार क्रमबद्ध किया गया है। विशेष रूप से, आपके उदाहरण के लिए प्रासंगिक उपयोगकर्ता परिभाषित रूपांतरण अनुक्रम § 13.3.3.1.2/1:

"उपयोगकर्ता द्वारा परिभाषित रूपांतरण अनुक्रम में प्रारंभिक मानक रूपांतरण अनुक्रम होता है जिसके बाद उपयोगकर्ता द्वारा परिभाषित रूपांतरण होता है (12.3) के बाद दूसरा मानक रूपांतरण अनुक्रम। [...] यदि उपयोगकर्ता द्वारा परिभाषित रूपांतरण एक रूपांतरण फ़ंक्शन (12.3.2) द्वारा निर्दिष्ट किया गया है, प्रारंभिक मानक रूपांतरण अनुक्रम स्रोत प्रकार को अंतर्निहित ऑब्जेक्ट पैरामीटर में परिवर्तित करता है रूपांतरण समारोह। "

सभी रूपांतरण यहाँ दृश्यों को शामिल:

  1. रूपांतरण समारोह का अंतर्निहित वस्तु पैरामीटर के स्रोत प्रकार के लिए एक काल्पनिक रूपांतरण;
  2. उपयोगकर्ता द्वारा परिभाषित रूपांतरण;
  3. operator << के इनपुट प्रकार में एक पहचान रूपांतरण।

ये रूपांतरण अनुक्रम सभी एक ही रैंक हैं। इस प्रकार, कॉल संदिग्ध होना चाहिए। यदि यह नहीं है, तो मेरे लिए यह एक कंपाइलर बग है।

+1

आपका उत्तर भ्रामक है, क्योंकि यहां कोई भी "दूसरा मानक रूपांतरण" नहीं होना चाहिए, क्योंकि उपयोगकर्ता द्वारा परिभाषित रूपांतरण सीधे निष्क्रिय प्रकार में परिवर्तित हो जाता है। तो हाँ, कॉल संदिग्ध होना चाहिए, लेकिन आपके तीसरे पैराग्राफ में दिए गए कारण के लिए नहीं। –

+0

@ क्रिस्टियन राउ: अगर मैं सही ढंग से समझता हूं कि 13.3.3.1.2/1 कहता है, तो उपयोगकर्ता द्वारा परिभाषित रूपांतरण * हमेशा * एक तीन-चरणीय रूपांतरण होता है, जहां पहला चरण काल्पनिक हो सकता है: "प्रारंभिक मानक रूपांतरण अनुक्रम स्रोत को परिवर्तित करता है रूपांतरण फ़ंक्शन के निहित ऑब्जेक्ट पैरामीटर पर टाइप करें। " –

+1

हां, लेकिन प्रारंभिक और दूसरा मानक रूपांतरण केवल नो-ऑप्स हो सकता है। और इस मामले में लक्ष्य प्रकार पहले से ही (मध्य) उपयोगकर्ता द्वारा परिभाषित रूपांतरण तक पहुंच चुके हैं। तो हाँ, उनके सभी के बराबर रैंक है, लेकिन इसलिए नहीं क्योंकि पूर्णांक-फ्लोट- या पॉइंटर-रूपांतरणों के बराबर रैंक है (इससे कोई फर्क नहीं पड़ता), लेकिन क्योंकि वे सभी में समान प्रारंभिक मानक रूपांतरण शामिल है, इसके बाद उपयोगकर्ता द्वारा परिभाषित किया गया है रूपांतरण, ** उसके बाद (नो-ऑप) दूसरा मानक रूपांतरण **। –

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