2011-10-06 16 views
13

मैं से MinGW का निर्माण किया है ट्रंक-संस्करण जीसीसी-4.7.0: http://code.google.com/p/mingw-builds/downloads/listगैर स्थैतिक डेटा सदस्य initializers सवाल

इस संस्करण की परिवर्तन यह कहा जाता है कि गैर स्थैतिक डेटा सदस्य initializers कार्यान्वित कर रहे हैं के विवरण में : http://gcc.gnu.org/gcc-4.7/changes.html

http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm

जब मैं इस तरह के एक उदाहरण के संकलन करने का प्रयास करें:

#include <iostream> 
#include <string> 

struct type { 
    type() 
     :i(33) 
    {} 

    int i; 
    std::string s("string"); 
}; 

int main() { 
    type t; 
    std::cout << t.i << " : " << t.s << std::endl; 
} 

मैं त्रुटियों की एक टन मिलता है, और यह एक छोर में है:

main.cpp: 16: 35: ध्यान दें: 'std :: स्ट्रिंग (प्रकार :: ) (int) {उर्फ एसटीडी :: basic_string (टाइप ::) (int)} 'कॉन्स्ट std :: basic_string < _CharT, _Traits, _Alloc>' main.cpp: 16: 35: नोट: ओवरलोड से पता हल नहीं कर सका फ़ंक्शन 't.type :: s'

लेकिन दस्तावेज़ीकरण के अनुसार, कोड सही है।

+4

मेरे पास इसका परीक्षण करने के लिए कोई GCC 4.7 स्थापित नहीं है और मेरा संस्करण नहीं है समर्थन सदस्य प्रारंभिकता, लेकिन क्या आप इसे -std = C++ 0x ध्वज के साथ संकलित करते हैं? – Griwes

+0

ध्यान दें कि सदस्य प्रारंभकर्ता जीसीसी 4.7 के लिए नए हैं, इसलिए यह एक साधारण कंपाइलर बग होना चाहिए। –

+0

ग्रीस के लिए: हाँ। – niXman

उत्तर

14

समस्या यह निर्धारित करने में अस्पष्टता प्रतीत होती है कि आप कोई फ़ंक्शन या ऑब्जेक्ट घोषित कर रहे हैं, और संकलक फ़ंक्शन चुन रहा है। , समस्या 1 में वे यह उल्लेख

std::string s = "string"; 

अगर हम गैर स्थैतिक डेटा सदस्य initializers (proposal N2756) के विषय में जीसीसी रिलीज नोट्स से लिंक का पालन करें:

इसके बजाय आप इस सिंटैक्स का उपयोग स्ट्रिंग आरंभ की कोशिश करनी चाहिए इस रिज़ॉल्यूशन नोट के साथ:

सीडब्ल्यूजी के पास क्लास-स्कोप लुकअप के पक्ष में कोना में 6 से 3 स्ट्रॉ पोल था; और यह पेपर प्रस्तावित करता है, गैर-स्थैतिक डेटा सदस्यों के प्रारंभकर्ताओं के साथ "= प्रारंभकर्ता-खंड" और "{ प्रारंभकर्ता-सूची}" फ़ॉर्म तक सीमित है।

+0

क्या इसका मतलब है कि 'std :: string s ("string"); 'वैध फ़ंक्शन-घोषणा है? क्या आप समझा सकते हैं कि मुझे इसकी व्याख्या कैसे करनी चाहिए? –

+3

क्या यह रचनाकारों के लिए भी काम करता है जो 'स्पष्ट' हैं?किसी भी तरह से मैं शायद 'std :: string s {"string"} पसंद करूंगा; '। –

+0

@ Björn: यह एक वैध घोषणा नहीं है। यदि यह वैध फ़ंक्शन घोषणा थी, तो कोई संकलन त्रुटि नहीं होगी। –

0

डेटा सदस्य को ब्रेस-या-बराबर-प्रारंभकर्ताओं द्वारा प्रारंभ किया जाना चाहिए। जाएँ http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm

8,5 initializers [dcl.init]

बदलें प्रारंभकर्ता के लिए व्याकरण:

प्रारंभकर्ता:

= ( expression-list ) 

ब्रेस या बराबर-प्रारंभकर्ता:

= initializer-clause 

    braced-init-list 
संबंधित मुद्दे