10

GCC 4.5.1, 수세 리눅스는 i686 우리가 다음 코드 한C++ 정적 템플릿 멤버 초기화 문제

가정하자 :이 경우

template<typename realT> class B 
{ 
public: 
    B() {std::cout << "B()" << std::endl;} 
}; 

template<typename realT> class A 
{ 
public: 
    static B<realT> static_var; 
}; 

template<typename realT> B<realT> A<realT>::static_var; 
template<> B<float> A<float>::static_var; 
template<> B<double> A<double>::static_var; 

int main() 
{ 
    A<float> test; 
    return 0; 
} 

우리가 표준 출력에 출력을 필요가 없습니다. 우리가 이런 식으로 초기화를 변경할 수 있습니다 경우 컴파일러는 부동 소수점 및 클래스 A의 이중 전문화

하지만 ..를 초기화하는 코드를 생성하지 않습니다

template<> B<float> A<float>::static_var = B<float>(); 
template<> B<double> A<double>::static_var = B<double>(); 

컴파일러는 코드를 생성하고 우리가해야합니다 출력에서 double "B()".

누군가 이러한 행동에 대한 이해를 도울 수 있습니까?

답변

8

n3337 14.7.3/13

템플릿의 정적 데이터 부재의 명백한 특성화 선언이 초기화를 포함하는 경우 정의이고; 그렇지 않으면 선언입니다. [참고 : 는 기본 초기화를 필요로하는 템플릿의 정적 데이터 멤버의 정의는 보강-초기화 목록 사용해야합니다

template<> X Q<int>::x; // declaration 
template<> X Q<int>::x(); // error: declares a function 
template<> X Q<int>::x { };// definition 

- 엔드 노트]

braced-init-list

C++11 기능입니다, 그래서 C++03에만 사용하실 수 있습니다

template<> X Q<int>::x = ...; 
+0

답변 해 주셔서 감사합니다! – Ribtoks

+0

그래서'x'가 기본 생성자 (C++ 11없이)에 의해 초기화된다면 어떻게할까요? – VF1