2012-05-31 14 views
7

Moja klasa Test ma element conststatic podtypu. Zwykle definiuję ten element conststatic w następujący sposób.Jak zdefiniować statyczny element const?

class Test 
{ 
public: 
    class Dummy {}; 

private: 
    static Dummy const dummy; 

}; 

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

int main() 
{ 
    return 0; 
} 

Podczas kompilowania tego źródła z gcc-4.6, nie daje błędu i kompiluje się poprawnie.

Podczas kompilowania tego samego źródła z gcc-4.4, daje następujący błąd: error: uninitialized const ‘Test::dummy’ w zaznaczonej linii.

  • Czy istnieje inny sposób na zdefiniowanie tej zmiennej stałej stałej stałej?
  • Czy jest to ograniczenie gcc-4.4?
  • Czy istnieje obejście?
+2

'testowa :: Dummy const manekin testowy :: :: = Test Dummy (); ' – dasblinkenlight

Odpowiedz

6

Powiedz:

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

Nie działa jednak z gcc 4.4, czy też nie? – bstamour

+1

Powinien działać tak długo, jak 'Test :: Dummy' jest agregatem (C++ 03) lub zawsze w C++ 11. –

+0

Ah right, Dummy jest typem POD. – bstamour

1

można również dodać domyślny konstruktor do class Dummy:

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

w wierszu 4.

EDIT: Wydaje się, że gcc 4.4 nie wygeneruj domyślny ctor dla klasy Dummy. W ten sposób powyższe błędy bezpośrednio kompilatora pokonują.

+1

Nie ma takiej potrzeby, 'Dummy' ma konstruktor domyślny syntetyzowany. – juanchopanza

+0

@juanchopanza dobrze, pod gcc 4.3.2, powyższy naprawił problem * bez * żadnych innych zmian w oryginalnym kodzie – Walter

+0

który wskazuje na błąd kompilatora ... – juanchopanza

0

z gcc 4.4, użyj

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

Z kompilatory wsparcie C++ 11, można użyć jednolitego inicjalizacji składni:

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

Ale nie sądzę, że jest wspierany przez gcc 4.4.

+0

Twoje pierwsze rozwiązanie nie działa na gcc 4.3.2, ale drugie (a la Kerrek SB) robi. – Walter

+0

Pierwszy powinien użyć 'Test :: Dummy()' not' Test :: Dummy'. W przypadku drugiej jednolita składnia inicjalizacji byłaby bez '=' tj. 'Test :: Dummy const Test :: dummy {};' –

2

Zobacz http://gcc.gnu.org/wiki/VerboseDiagnostics#uninitialized_const (co daje odpowiednie odniesienie do normy), a także GCC 4.6 release notes które mówią

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.

Powiązane problemy