2012-05-31 4 views
7

Test 클래스에는 하위 유형의 구성원 conststatic이 있습니다. 나는 보통 다음과 같이 이것을 conststatic member로 정의합니다.정적 const 멤버를 정의하는 방법은 무엇입니까?

class Test 
{ 
public: 
    class Dummy {}; 

private: 
    static Dummy const dummy; 

}; 

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

int main() 
{ 
    return 0; 
} 

이 소스를 gcc-4.6으로 컴파일 할 때 오류가없고 올바르게 컴파일됩니다.

동일한 소스를 gcc-4.4로 컴파일 할 때 다음과 같은 오류가 발생합니다 : error: uninitialized const ‘Test::dummy’ 표시된 줄에.

  • 이 정적 const 멤버 변수를 정의하는 또 다른 방법이 있습니까?
  • gcc-4.4의 제한 사항입니까?
  • 해결 방법이 있습니까?
+2

'테스트 :: 더미 const를 테스트 :: 더미 = 시험 :: 더미 ();' – dasblinkenlight

답변

6

말 :

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

gcc 4.4에서는 작동하지 않습니까, 아니면 그렇게할까요? – bstamour

+1

'Test :: Dummy'가 집합체 (C++ 03)이거나 항상 C++ 11에서 작동해야합니다. –

+0

아, Dummy는 POD 유형입니다. – bstamour

1

당신은 또한 class Dummy에 기본의 ctor를 추가 할 수 있습니다

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

4.

편집 : 는 GCC 4.4에 실패 표시 클래스 Dummy에 대한 기본 ctor를 생성하십시오. 따라서 위 코드는이 컴파일러 버그를 직접 해결합니다. GCC 4.4

+1

그럴 필요가 없다.'Dummy'는 컴파일러가 합성 한 기본 생성자를 가지고있다. – juanchopanza

+0

@juanchopanza 글쎄, gcc 4.3.2에서 위의 코드를 수정하지 않고 문제를 수정했다. – Walter

+0

컴파일러 버그를 암시하는 ... – juanchopanza

0

는, 컴파일러는 C++ 11 지원으로

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

을 사용하면 균일 한 초기화 구문을 사용할 수 있습니다

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

을하지만 나는이 GCC 4.4에서 지원 생각하지 않습니다.

+0

첫 번째 해결책은 gcc 4.3.2에서 작동하지 않지만 두 번째는 Kerrek SB에서 수행됩니다. – Walter

+0

첫 번째 것은'Test :: Dummy()'가 아니라'Test :: Dummy()'를 사용해야합니다. 두 번째 경우, uniform 초기화 문법은'='즉'Test :: Dummy const Test :: dummy {}; –

2

http://gcc.gnu.org/wiki/VerboseDiagnostics#uninitialized_const 참조 (표준에 관련 참조를 제공하는) 또한 GCC 4.6 release notes는 말을

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.

관련 문제