2011-11-09 18 views
16

¿Está declarando un campo estático de un tipo que está incompleto en el momento de la definición de clase legal en C++? Por ejemplo:Campo estático de un tipo incompleto: ¿es legal?

foo.h:

class Foo 
{ 
public: 
    // ... 
private: 
    class Bar; 
    static Bar something; 
}; 

foo.cpp:

class Foo::Bar 
{ 
    // ... 
}; 

Foo::Bar Foo::something; 

// some more code 

compiladores parecen aceptarlo, y no veo una razón por la cual debe ser rechazado, pero ¿qué dice la norma sobre tal situación? Realmente apreciaría que alguien brinde una cita directa del estándar, preferiblemente del "antiguo" (el de 2003).

Respuesta

13

Sí, lo que está haciendo está específicamente permitido (§9.4.2/2): "La declaración de un miembro de datos estáticos en su definición de clase no es una definición y puede ser de un tipo incompleto que no sea cv- vacío calificado ".

2

No puedo citar el estándar, pero puedo darte el consejo de "pensar como un compilador".

En el punto en el que declara something, ¿qué necesita saber el compilador sobre el tipo? Si fuera un miembro normal, necesitaría saber el tamaño para poder incluirlo en la definición de la clase, pero eso no es cierto para los miembros estáticos porque su almacenamiento no es parte de la clase. No necesita saber cómo construirlo porque no se construirá como parte de la construcción de la clase. Realmente no hay nada que el compilador necesite saber sobre esa clase estática en el momento en que se declara, por lo que una declaración directa funciona bien.

+1

Sí. Por eso dije: "No veo una razón por la cual deba rechazarse". Sé lo que has escrito, simplemente no estaba seguro de si el estándar no permite un código como ese por algún motivo (es C++, nunca puedes estar seguro), es por eso que quería un presupuesto directo. Además, tuve que hacer mi primera pregunta aquí;) – Fanael

Cuestiones relacionadas