2010-10-03 27 views
5

De acuerdo con la C++0x spec, lo siguiente es legalC++ 0x Constructor Peer en VC2010

class A { 
    A(int i) : x(i) {} 
    A() : A(0) {} 
    int x; 
}; 

Pero falla al compilar ("A" is not a nonstatic data member or base class of class "A") en VC 2010. Alguien sabe lo que está mal?

+0

Quizás no haya especificado C++ 0x en la configuración de su compilador. – JoshD

+4

Esa no es la especificación C++ 0x. La especificación C++ 0x todavía está en borrador y en espera de aprobación, y no se parece en nada a la wikipedia. Aquí está el "Borrador final del comité": http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3092.pdf –

Respuesta

8

Visual C++ 2010 (también conocido como VC++ 10.0) al momento de escribir esto no admite la delegación de constructores, que es lo que su fragmento de código requiere. VC++ 10.0 solo tiene soporte parcial para C++ 0x, y hasta el momento de escribir esto, ningún compilador ha implementado todo el conjunto de características de C++ 0x (aunque eso cambiará pronto, especialmente una vez que el estándar C++ 0x esté finalizado).

Scott Meyers tiene a summary of C++0x support in gcc and MSVC compilers. Aquí hay otra lista de C++0x feature support in different compilers. Además, a list of C++0x features supported in Visual C++ 2010 straight from the horse's mouth.

Por ahora, inicializar todos los miembros directamente en la lista de inicialización de sus constructores:

class A 
{ 
public: 
    A(int i) : x(i) {} 
    A() : x(0) {} 
private: 
    int x; 
}; 
+0

Sorprendentemente, A() {A (0); } funciona por alguna razón. – jameszhao00

+6

@ jameszhao00: "funciona" porque no es un constructor delegante. Estás creando un 'A' temporal sin nombre que será destruido una vez que el constructor termine, que no es lo que deseas. –

+0

¡Buen punto! Gracias por esa aclaración. Demasiado utilizado para Java/C# Supongo que :( – jameszhao00