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?我试着沿着那条路走,但它很快就变得难以辨认并且吐出了更多的错误。

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;
4

1 回答 1

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();
于 2013-02-13T21:41:14.323 回答