2012-11-20 2 views
1

런타임 중에 정적 멤버가있는 템플릿 구조체가있는 클래스에 대한 정보를 저장하려고하지만 오류없이 정적 멤버를 가져 오거나 설정할 수 없습니다.런타임 중에 템플릿 구조체의 정적 멤버 가져 오기/설정

왜이 코드가 작동하지 않습니까?

template <typename T> 
struct InfoHolder 
{ 
    static const char* name;  
}; 

int main() 
{ 
    InfoHolder<int>::name = "This is an integer"; 
    cout << InfoHolder<int>::name << endl; 

    return 0; 
} 

답변

2

링커 오류가 발생하는 경우. 어딘가에 name 변수를 정의해야합니다. 이 클래스 후 주 전에

쓰기 (그것이 오브젝트의 일부가 아닌 원인 클래스에 선언하는 것은, 어디를 할당하지 않습니다) :

template <typename T> 
const char *InfoHolder<T>::name; 

을 그것은 정적 데이터의 작은 불편 회원.

+1

이것은 가장 잘 작동하는 것 같습니다. – sFuller

0

다른 곳에서도 사용되는 것을 보았습니다.

구조체의 정적 멤버가 할당되지 않았으므로 함수의 정적 멤버를 사용하고 변수에 포인터를 반환 할 수 있습니다.

template <typename T> 
struct InfoHolder 
{ 
    static const char** getName() 
    { 
     static const char* name; 
     return &name; 
    } 
}; 

int main() 
{ 
    *InfoHolder<int>::getName() = "This is an integer"; 
    *InfoHolder<MyClass>::getName() = "This is an MyClass"; 
    *InfoHolder<OtherClass>::getName() = "This is an OtherClass"; 
    cout << *InfoHolder<int>::getName() << endl; 
    cout << *InfoHolder<MyClass>::getName() << endl; 
    cout << *InfoHolder<OtherClass>::getName() << endl; 
} 
관련 문제