다음 코드 조각이 있는데 작동하지 않습니다. 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를 제거해야합니까? 나는 그 길을 내려 보았지만, 빨리 읽을 수 없으며 더 많은 오류가 나왔다. DataMap
가 MyClass<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;
당신이 두 차례 나오는 전에에서 '유형 이름을'퍼팅 시도해 봤어 : 따라서, (당신이 복사 초기화의 오른쪽에 DataMap? –
bstamour
DataMap
후 괄호를 잊었 때문에 당신에게 문제를 제공하는)를= MyClass<T>::DataMap
부분을 생략 충분하다 MyClass나는이 두 가지를 시도 : '템플릿 유형 이름의 MyClass에 :: 데이터 맵 MyClass에 :: 데이터 맵 = MyClass에 :: 데이터 맵;'와 '템플릿 유형 이름 MyClass에 :: 데이터 맵 MyClass에 :: 데이터 맵 = 유형 이름 MyClass에 :: DataMap; ' 모두 실패했습니다. –
kwiqsilver
@kwiqsilver : 첫 번째 형식 이름은 필요하며 두 번째 형식 이름은 필요하지 않습니다. copy-initialization을 사용한다면'DataMap' 뒤에 괄호 ('()')를 사용해야합니다. 아래 내 대답을 참조하십시오. –