2012-05-31 31 views
7

Mi clase Test tiene un conststatic miembro de un subtipo. Normalmente defino este miembro conststatic de la siguiente manera.¿Cómo se define el miembro de estást estático?

class Test 
{ 
public: 
    class Dummy {}; 

private: 
    static Dummy const dummy; 

}; 

Test::Dummy const Test::dummy;    // ERROR HERE 

int main() 
{ 
    return 0; 
} 

Al compilar esta fuente con gcc-4.6, no da error y se compila correctamente.

Al compilar esta misma fuente con gcc-4.4, da el siguiente error: error: uninitialized const ‘Test::dummy’ en la línea marcada.

  • ¿Hay alguna otra manera de definir esta variable estática miembro miembro?
  • ¿Es esta una limitación de gcc-4.4?
  • ¿Hay una solución?
+2

'Test :: maniquí const Test :: ficticia = Test :: simulada (); ' – dasblinkenlight

Respuesta

6

Di:

Test::Dummy const Test::dummy = { }; 
+0

No funcionará con gcc 4.4, ¿o sí? – bstamour

+1

Debería funcionar siempre que 'Test :: Dummy' sea agregado (C++ 03), o siempre en C++ 11. –

+0

Ah, cierto, Dummy es un tipo POD. – bstamour

1

también se puede añadir un valor predeterminado a Héctor class Dummy:

class Dummy { public: Dummy(){} }; 

en la línea 4.

EDIT: Parece que gcc 4.4 no generar el ctor predeterminado para la clase Dummy. Por lo tanto, lo anterior supera este error de compilación directamente.

+1

No es necesario, 'Dummy' tiene un constructor por defecto sintetizado por el compilador. – juanchopanza

+0

@juanchopanza bien, bajo gcc 4.3.2, lo anterior solucionó el problema * sin * ningún otro cambio en el código original – Walter

+0

que insinúa un error en el compilador ... – juanchopanza

0

con GCC 4.4, utilice

Test::Dummy const Test::dummy = Test::Dummy; 

Con el apoyo compiladores de C++ 11, puede utilizar la sintaxis de inicialización uniforme:

Test::Dummy const Test::dummy = { }; 

Pero no creo que pueda utilizar con gcc 4.4.

+0

su primera solución no funciona en gcc 4.3.2, pero la segunda (a la Kerrek SB) sí. – Walter

+0

El primero debe usar 'Test :: Dummy()' not 'Test :: Dummy'. Para el segundo, la sintaxis de inicialización uniforme sería sin '=' i.e. 'Test :: Dummy const Test :: dummy {};' –

2

Ver http://gcc.gnu.org/wiki/VerboseDiagnostics#uninitialized_const (que da la referencia correspondiente a la norma) y también el GCC 4.6 release notes que se dicen

In 4.6.0 and 4.6.1 G++ no longer allows objects of const-qualified type to be default initialized unless the type has a user-declared default constructor. In 4.6.2 G++ implements the proposed resolution of DR 253 , so default initialization is allowed if it initializes all subobjects. Code that fails to compile can be fixed by providing an initializer e.g.

struct A { A(); }; 
struct B : A { int i; }; 
const B b = B(); 

Use -fpermissive to allow the old, non-conforming behaviour.

Cuestiones relacionadas