2012-05-31 4 views
7

Meine Klasse Test hat einen conststatic Member eines Subtyps. Normalerweise definiere ich dieses conststatic Element wie folgt.Wie definiere ich statisches const Mitglied?

class Test 
{ 
public: 
    class Dummy {}; 

private: 
    static Dummy const dummy; 

}; 

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

int main() 
{ 
    return 0; 
} 

Beim Kompilieren dieser Quelle mit gcc-4.6 gibt es keinen Fehler und kompiliert korrekt.

Wenn diese gleiche Quelle mit gcc-4.4 kompiliert, gibt es folgende Fehlermeldung: error: uninitialized const ‘Test::dummy’ auf der markierten Linie.

  • Gibt es eine andere Möglichkeit, diese statische konstante Elementvariable zu definieren?
  • Ist dies eine Einschränkung von gcc-4.4?
  • Gibt es einen Workaround?
+2

'Test :: Dummy const Test :: Dummy = Test :: Dummy (); ' – dasblinkenlight

Antwort

6

Sprich:

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

Funktioniert nicht mit gcc 4.4 obwohl, oder wird es? – bstamour

+1

Sollte funktionieren, solange "Test :: Dummy" aggregiert ist (C++ 03) oder immer in C++ 11. –

+0

Ah richtig, Dummy ist ein POD-Typ. – bstamour

1

Sie auch einen Standard Ctor zu class Dummy hinzufügen könnte:

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

in Zeile 4.

EDIT: Es scheint, dass gcc 4.4 nicht auf Generiere den Standard-Ctor für Klasse Dummy. Das obige überwindet den Compiler-Fehler also direkt.

+1

Keine Notwendigkeit dafür, "Dummy" hat einen compiler-synthetisierten Standardkonstruktor. – juanchopanza

+0

@juanchopanza gut, unter GCC 4.3.2, das oben genannte Problem behoben * ohne * andere Änderungen am ursprünglichen Code – Walter

+0

, die auf einen Compiler-Bug deutet ... – juanchopanza

0

mit gcc 4.4, verwenden

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

Mit Compiler C++ 11 unterstützt, können Sie einheitliche Initialisierung Syntax:

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

Aber ich glaube nicht, dass von gcc 4.4 unterstützt wird.

+0

Ihre erste Lösung funktioniert nicht auf gcc 4.3.2, aber die zweite (a la Kerrek SB) tut. – Walter

+0

Der erste sollte 'Test :: Dummy()' nicht 'Test :: Dummy' verwenden. Für die zweite wäre eine einheitliche Initialisierungssyntax ohne das '=' d. H. 'Test :: Dummy const Test :: dummy {};' –

2

Siehe http://gcc.gnu.org/wiki/VerboseDiagnostics#uninitialized_const (die den Standard der entsprechende Referenz gibt) und auch die GCC 4.6 release notes die sagen

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.