我有以下代码段,但它不起作用。 dataMap成员应该包含一个回调函数,该函数需要T&amp;并且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?我尝试沿着这条路走下去,但它很快就难以辨认,并吐出更多的错误。
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 :(得分:7)
编译器正确地建议您可能要包含typename
关键字,因为DataMap
是MyClass<T>::DataMap
中的限定依赖名称。静态成员定义应如下所示:
template <typename T>
typename MyClass<T>::DataMap MyClass<T>::dataMap;
该成员将默认构建,因此无需复制 - 初始化。因此,省略= MyClass<T>::DataMap
部分就足够了(这会给你带来麻烦,因为你忘记了复制初始化右侧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();