2013-02-13 2 views
3

다음 코드 조각이 있는데 작동하지 않습니다. dataMap 멤버는 T & 및 T가 적절한 시간에 콜백에 전달되는 콜백 함수를 포함해야합니다. 템플릿 멤버 초기화가 실패 (g ++ 4.7.2에서) : error: need ‘typename’ before ‘MyClass<T>::DataMap’ because ‘MyClass<T>’ is a dependent scope. 나는 그것이 말한 곳에서 typename을 고집하려고 노력했지만 다른 에러가 발생했습니다 : error: expected primary-expression before ‘;’ token. 이렇게 할 수 있습니까, 아니면 초기화에서 typedef를 제거해야합니까? 나는 그 길을 내려 보았지만, 빨리 읽을 수 없으며 더 많은 오류가 나왔다. DataMapMyClass<T>::DataMap에서 자격을 갖춘 의존 이름이기 때문에템플릿 클래스의 정적 템플릿 멤버 초기화

template <typename T> class MyClass 
{ 
public: 
    typedef void(*CallbackType)(T&); 
    typedef std::unordered_map<int, std::pair<T, CallbackType>/**/> DataMap; 
    static DataMap dataMap; 
    ... 
}; 

template <typename T> MyClass<T>::DataMap MyClass<T>::dataMap = MyClass<T>::DataMap; 
+0

당신이 두 차례 나오는 전에에서 '유형 이름을'퍼팅 시도해 봤어 : 따라서, (당신이 복사 초기화의 오른쪽에 DataMap 후 괄호를 잊었 때문에 당신에게 문제를 제공하는)를 = MyClass<T>::DataMap 부분을 생략 충분하다 MyClass DataMap? – bstamour

+0

나는이 두 가지를 시도 : '템플릿 유형 이름의 MyClass에 :: 데이터 맵 MyClass에 :: 데이터 맵 = MyClass에 :: 데이터 맵;'와 '템플릿 유형 이름 MyClass에 :: 데이터 맵 MyClass에 :: 데이터 맵 = 유형 이름 MyClass에 :: DataMap; ' 모두 실패했습니다. – kwiqsilver

+0

@kwiqsilver : 첫 번째 형식 이름은 필요하며 두 번째 형식 이름은 필요하지 않습니다. copy-initialization을 사용한다면'DataMap' 뒤에 괄호 ('()')를 사용해야합니다. 아래 내 대답을 참조하십시오. –

답변

7

컴파일러는 올바르게, 당신은 typename 키워드를 포함 할 수도 있음을 시사한다.

template <typename T> 
typename MyClass<T>::DataMap MyClass<T>::dataMap; 

멤버가 구축 기본값이됩니다, 그래서 복사 초기화 할 필요가 없습니다 : 정적 멤버의 정의는 다음과 같아야합니다.

// This is also valid (mind the parentheses to invoke the 
// constructor of `DataMap`), but unnecessary. 
template <typename T> 
typename MyClass<T>::DataMap MyClass<T>::dataMap = MyClass<T>::DataMap(); 
+0

= 기호 다음에 'typename'이 필요하지 않습니까? – bstamour

+1

@bstamour : 사용할 수는 있지만 필수는 아닙니다. –

+0

상속 목록에 필요하지 않은 것과 비슷합니다. 그 맥락에서 그것은 단지 하나의 타입 일 수 있으며 따라서 애매 모호하지 않습니다. – bstamour

관련 문제