2012-05-31 20 views
7

La mia classe Test ha un membro conststatic di un sottotipo. Di solito definisco questo membro conststatic come segue.Come definire un membro const statico?

class Test 
{ 
public: 
    class Dummy {}; 

private: 
    static Dummy const dummy; 

}; 

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

int main() 
{ 
    return 0; 
} 

Durante la compilazione di questa sorgente con gcc-4.6, non genera errori e non viene compilato correttamente.

Quando si compila la stessa sorgente con gcc-4.4, si dà il seguente errore: error: uninitialized const ‘Test::dummy’ sulla linea evidenziata.

  • C'è un altro modo per definire questa variabile membro const const?
  • Si tratta di una limitazione di gcc-4.4?
  • C'è una soluzione alternativa?
+2

'Test :: Dummy const Test :: manichino = Test :: Dummy (' – dasblinkenlight

risposta

6

Di ':

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

Tuttavia, non funzionerà con gcc 4.4 o lo farà? – bstamour

+1

Dovrebbe funzionare finchè 'Test :: Dummy' è aggregato (C++ 03), o sempre in C++ 11. –

+0

Ah, il manichino è un tipo POD. – bstamour

1

si potrebbe anche aggiungere un ctor di default per class Dummy:

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

in linea 4.

EDIT: Sembra che gcc 4.4 non riesce a genera il ctor predefinito per la classe Dummy. Quindi quanto sopra supera direttamente questo errore del compilatore.

+1

Non ce n'è bisogno, 'Dummy' ha un costruttore predefinito sintetizzato dal compilatore. – juanchopanza

+0

@juanchopanza bene, sotto gcc 4.3.2, quanto sopra risolto il problema * senza * altre modifiche al codice originale – Walter

+0

che allude a un bug del compilatore ... – juanchopanza

0

con GCC 4.4, utilizzare

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

con i compilatori C++ di supporto 11, è possibile utilizzare la sintassi di inizializzazione uniforme:

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

Ma io non credo che sia supportato da gcc 4.4.

+0

la tua prima soluzione non funziona su gcc 4.3.2, ma il secondo (a la Kerrek SB) lo fa. – Walter

+0

Il primo dovrebbe usare 'Test :: Dummy()' non 'Test :: Dummy'. Per il secondo, la sintassi di inizializzazione uniforme sarebbe senza '=' i.e. Test :: Dummy const Test :: dummy {}; ' –

2

Vedi http://gcc.gnu.org/wiki/VerboseDiagnostics#uninitialized_const (che dà il relativo riferimento alla norma) e anche il GCC 4.6 release notes che dicono

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.

Problemi correlati