2010-04-05 12 views
36

Tener código:Ctor no permitido tipo de retorno

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

B::B(const B& pattern) 
{ 

} 

estoy recibiendo mensaje de error:
'error de error 1 C2533: 'B :: {} ctor': constructores no se les permite un tipo de retorno'

¿Alguna idea de por qué?
P.S. Estoy usando VS 2010RC

+23

ah, el temido punto y coma al final de struct/class. – falstro

Respuesta

65

Falta un punto y coma después de su definición struct.


El error es correcto, los constructores no tienen ningún tipo de retorno. Debido a que se está perdiendo un punto y coma, toda esa definición struct es visto como un tipo de cambio de una función, como en:

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

Añadir su punto y coma:

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

Gracias. Por cierto, ¿alguien sabe en C++ 0x que no habrá necesidad de ese tonto punto y coma? Cuando piensas en esto, es algo incosistente con otras construcciones en C++. ¿O me estoy perdiendo algo? –

+0

Es una especie de resaca, la declaración de una estructura es la definición de un tipo, y la declaración de una clase se ve como una estructura. ps VS2010 te advierte sobre esto! –

+10

@Martin: no es solo una "resaca" de C. Algo como: 'clase {/ * ... * /} objeto;' está permitido, por lo que el punto y coma es * necesario * para decirle al compilador que ha llegado al final de la definición de clase. –

12

Se necesita un mejor compilador. Con g ++:

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 

se necesita El punto y coma porque termina una posible lista de instancias del struct:

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

crea tres casos de B llamados x, y y z. Esto es parte del patrimonio C de C++, y seguirá estando allí en C++ 0x.

+0

+1 para la respuesta, -1 para la justificación. Es relativamente fácil de implementar (para profesionales) que si no hay nada después del paréntesis es el final del decl. –

+2

@atch ¿Eres un experto en analizar C++ ahora? El punto es que * hay * algo después de la estructura, tu constructor. –

+1

@atch: ¿Alguna vez ha escrito un compilador? – GManNickG

Cuestiones relacionadas