यह एक बहुत ही बुनियादी सवाल है लेकिन मुझे समझ में नहीं आता कि नीचे दिया गया कोड जीसीसी 4.6.1 पर संकलित क्यों नहीं करता है। यह SP1 के साथ वी.एस. 2008 को संकलित करता है:अजीब जीसीसी संकलन त्रुटि (सरल उदाहरण शामिल)
#include <iostream>
class MyClass
{
public:
const static int MinValue = -1000;
const static int MaxValue = 1000;
};
void printValue(int i)
{
std::cout << i << std::endl;
}
int main(int argc, char** argv)
{
printValue(MyClass::MinValue);
printValue(MyClass::MaxValue);
printValue(argc < 42 ? MyClass::MinValue : MyClass::MaxValue); //This line gives the error
}
जीसीसी का कहना है:
[email protected]:~/temp$ g++ test.cpp
/tmp/ccN2b95G.o: In function `main':
test.cpp:(.text+0x54): undefined reference to `MyClass::MinValue'
test.cpp:(.text+0x5c): undefined reference to `MyClass::MaxValue'
collect2: ld returned 1 exit status
हालांकि, अगर मैं तो यह बनाता है और सही ढंग से चले 'printValue' के लिए तीसरी कॉल बाहर ले। तो यह '?' के साथ कुछ करने के लिए है ऑपरेटर ... क्या यह इस तरह उपयोग करने के लिए मान्य नहीं है? इसके अलावा, अगर मैं 'argc < 42' को 'सत्य' या 'झूठी' के साथ प्रतिस्थापित करता हूं तो यह भी ठीक बनाता है।
कोई विचार ?!
कंपाइलर की बग? –
@VJovic: नहीं - यह एक परिभाषा होनी चाहिए यदि यह * odr-used * है, यह तब तक है जब तक कि यह एक ऐसा ऑब्जेक्ट नहीं है जो निरंतर अभिव्यक्ति में दिखाई देने के लिए आवश्यकताओं को पूरा करता है और लैवल्यू-टू-रावल्यू रूपांतरण तुरंत लागू होता है " । फ़ंक्शन तर्कों के लिए यह मामला है, लेकिन सशर्त ऑपरेटर के परिणाम के लिए नहीं जब स्थिति निरंतर अभिव्यक्ति नहीं होती है और नतीजा एक अंतराल होता है। –
@ माइकसेमोर: मुझे लगता है कि मैंने ओडीआर-प्रयुक्त और टर्नरी ऑपरेटरों के बारे में कुछ मेल पढ़े हैं, क्या आप इसे उचित उत्तर में विस्तारित करना चाहते हैं? मैं वास्तव में यहाँ subtlety समझना चाहता हूँ। –