2017-10-11 29 views
9

निम्नलिखित कोड में, मैंने unscoped enumerationlong long प्रकार के साथ परिभाषित किया है। यह प्रोग्राम क्लैंग पर ठीक काम करता है।जीसीसी: Unscoped गणना प्रकार एक अस्पष्टता त्रुटि

लेकिन जीसीसी कंपाइलर अस्पष्टता त्रुटि देता है।

#include <iostream> 

enum : long long { Var=5 }; 

void fun(long long ll) 
{ 
    std::cout << "long long : " << ll << std::endl; 
} 

void fun(int i) 
{ 
    std::cout << "int : " << i << std::endl; 
} 

int main() 
{ 
    fun(Var); 
} 

जीसीसी उत्पन्न त्रुटि:

main.cpp: In function 'int main()': 
main.cpp:17:12: error: call of overloaded 'fun(<unnamed enum>)' is ambiguous 
    fun(Var); 
      ^
main.cpp:5:6: note: candidate: void fun(long long int) 
void fun(long long ll) 
     ^~~ 
main.cpp:10:6: note: candidate: void fun(int) 
void fun(int i) 
     ^~~ 

क्यों जीसीसी संकलक एक अस्पष्टता त्रुटि देता है?

उत्तर

12

जीसीसी गलत है।

Unscoped गणन उसके अंतर्निहित प्रकार में कनवर्ट प्रकार है योग्य integral promotion के रूप में:

एक unscoped गणना प्रकार जिसका अंतर्निहित प्रकार तय हो गई है, ... (सी ++ 11 के बाद से) उसके अंतर्निहित प्रकार में बदला जा सकता

Varint को परिवर्तित करने के लिए हालांकि यह एक और integral conversion (long long से int करने के लिए) की आवश्यकता है।

2) संवर्धन:: अभिन्न पदोन्नति, फ्लोटिंग प्वाइंट पदोन्नति

3) रूपांतरण: अभिन्न रूपांतरण, फ्लोटिंग प्वाइंट रूपांतरण, चल इंटीग्रल पदोन्नतिoverload resolution में अभिन्न रूपांतरण की तुलना में अधिक रैंकिंग है -integral रूपांतरण, सूचक रूपांतरण, सूचक करने वाली सदस्य रूपांतरण, बूलियन रूपांतरण, उसके आधार करने के लिए एक व्युत्पन्न वर्ग के उपयोगकर्ता परिभाषित रूपांतरण

फिर fun(long long ll) बेहतर मिलान होना चाहिए।


Here जीसीसी बग रिपोर्ट है; इसे 2017-10-24 में तय किया गया है। LIVE

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