2010-04-05 18 views
36

होने कोड:ctor अनुमति नहीं वापसी प्रकार

struct B 
{ 
    int* a; 
    B(int value):a(new int(value)) 
    { } 
    B():a(nullptr){} 
    B(const B&); 
} 

B::B(const B& pattern) 
{ 

} 

मैं हो रही है त्रुटि संदेश:
'त्रुटि 1 त्रुटि C2533:' बी :: {ctor} ': कंस्ट्रक्टर्स अनुमति नहीं एक वापसी प्रकार'

कोई विचार क्यों?
पीएस मैं वीएस 2010 आरसी

+23

आह, संरचना/कक्षा के अंत में भयभीत सेमी-कोलन। – falstro

उत्तर

65

का उपयोग कर रहा हूं आप struct परिभाषा के बाद अर्धविराम खो रहे हैं।


त्रुटि सही है, रचनाकारों के पास कोई वापसी प्रकार नहीं है। क्योंकि आप एक अर्धविराम भूल रहे हैं, कि पूरे struct परिभाषा के रूप में, एक समारोह के लिए एक वापसी प्रकार के रूप में देखा जाता है:

// vvv return type vvv 
struct { /* stuff */ } foo(void) 
{ 
} 

अपने अर्धविराम जोड़ें:

struct B 
{ 
    int* a; 
    B(int value):a(new int(value)) 
    { } 
    B():a(nullptr){} 
    B(const B&); 
}; // end class definition 

// ah, no return type 
B::B(const B& pattern) 
{ 

} 
+0

धन्यवाद। बीटीडब्ल्यू किसी को सी ++ 0x में जानता है कि उस मूर्ख अर्धविराम की आवश्यकता नहीं होगी? जब आप इसके बारे में सोचते हैं तो यह सी ++ में अन्य संरचनाओं के साथ कुछ हद तक असंगत है। या क्या मैं कुछ न कुछ भूल रहा हूं? –

+0

यह एक प्रकार का हैगओवर है, एक संरचना की घोषणा एक प्रकार की परिभाषा है, और एक वर्ग की घोषणा एक संरचना की तरह दिखती है। पीएस वीएस -2010 आपको इसके बारे में चेतावनी देता है! –

+10

@ मार्टिन: यह सी से सिर्फ "हैंगओवर" नहीं है। कुछ ऐसा: 'वर्ग {/ * ... * /} ऑब्जेक्ट;' अनुमति है, इसलिए अर्धविराम * आवश्यक * संकलक को यह बताने के लिए है कि यह अंत तक पहुंच गया है कक्षा परिभाषा। उत्तर के लिए –

12

आप एक बेहतर संकलक की जरूरत है। जी ++ के साथ:

a.cpp:1: error: new types may not be defined in a return type 
a.cpp:1: note: (perhaps a semicolon is missing after the definition of 'B') 
a.cpp:5: error: return type specification for constructor invalid 

अर्धविराम की जरूरत है क्योंकि यह struct के उदाहरण के संभावित सूची समाप्त हो जाता है जाता है:

struct B { 
... 
} x, y, z; 

बी के तीन मामलों एक्स, वाई और जेड बुलाया बनाता है। यह सी ++ की विरासत का हिस्सा है, और अभी भी सी ++ 0x में होगा।

+0

+1, -1 तर्क के लिए -1। यह लागू करने के लिए अपेक्षाकृत आसान है (पेशेवरों के लिए) कि यदि गिरावट के अंत में ब्रैकेट के बाद कुछ भी नहीं है। –

+2

@atch अब आप सी ++ पार्सिंग पर एक विशेषज्ञ हैं? मुद्दा यह है कि संरचना के बाद * कुछ * है - आपका कन्स्ट्रक्टर। –

+1

@atch: क्या आपने कभी एक कंपाइलर लिखा है? G ++ की सिफारिश करने के लिए – GManNickG

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