2012-06-19 13 views
16

VS2010 के साथ निम्नलिखित कोड 0, इसके विपरीत प्रिंट मेरी उम्मीदों के लिए:पेट क्यों है (जटिल <int>) हमेशा शून्य लौटाता है?

#include <complex> 
#include <iostream> 

using namespace std; 

int main(void) 
{ 
    complex<int> z(20, 200); 
    cout << abs<int>(z) << endl; 
    return 0; 
} 

यह ठीक काम करता है जब प्रकार double है।

उत्तर

23
सी ++ आईएसओ कल्पना के अनुसार

, § 26.2/2:

से float, double या long double अनिर्दिष्ट है अन्य किसी भी प्रकार के लिए टेम्पलेट complex instantiating का प्रभाव।

दूसरे शब्दों में, संकलक complex<int> को तत्काल करने पर जो कुछ भी करना चाहता है वह कर सकता है। तथ्य यह है कि आप यहां 0 प्राप्त कर रहे हैं एक भाषा परिप्रेक्ष्य से पूरी तरह से परिभाषित व्यवहार है।

एक तुलना के लिए - ideone's version of gcc पर, इस कोड को भी संकलित नहीं है। यह एक और पूरी तरह से वैध विकल्प है।

आशा है कि इससे मदद मिलती है!

+0

हुह, मैं भी अपने ही वास्तविक संख्या प्रकार का उपयोग करने की अनुमति नहीं कर रहा हूँ? यह निराशाजनक है। –

+0

@ पॉलमैंटा- हाँ, मुझे नहीं लगता। मुझे नहीं पता कि यह क्यों है। – templatetypedef

+1

आपके उत्तर के लिए धन्यवाद। 0, 200 या 42 लौटने पर व्यवहार को निर्दिष्ट नहीं किया जा सकता है, लेकिन निश्चित रूप से यह मेरे जैसे आरामदायक प्रोग्रामर के लिए काफी परेशानी है। – Artium

6

MinGW पर यह प्रिंट 200 4.6.2।

हालांकि, सी ++ आईएसओ मानक खंड 26.2.2 में:

float, double या long double अलावा अन्य किसी भी प्रकार के लिए टेम्पलेट complex instantiating के प्रभाव अनिर्दिष्ट है।

तो आपका निर्माण वातावरण complex<int> के लिए अपरिभाषित व्यवहार प्रदर्शित कर रहा है, जो मानक के खिलाफ नहीं है।

templatetypedef ने बताया, ideone's C99 compiler (जीसीसी 4.3.4) इसे पूरी तरह से संकलित करने से इंकार कर देता है।

+0

यह वास्तव में [4.5.1] (http://ideone.com/pLiug) है, वास्तव में। – Puppy

+0

@DeadMG - 'templatetypedef' के उदाहरण में उपयोग किया गया संस्करण 4.399 है, सी 99 के लिए। आपका लिंक सी ++ 0x का उपयोग करता है, जो संस्करण 4.5.1 है, [यह पृष्ठ] देखें (http://ideone.com/samples#sample_lang_44) – Unsigned

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