c++ - 初始化模板类的静态模板化成员

标签 c++ templates static-members

我有以下代码片段,但它不起作用。 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;

最佳答案

编译器正确地建议您可能想要包含 typename关键字,因为 DataMapMyClass<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();

关于c++ - 初始化模板类的静态模板化成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14863628/

相关文章:

C++套接字二进制文件

c++ - RSA算法——无法验证d

c++ - Visual Studios 2012 中的默认模板参数

C++模板元编程成员函数循环展开

c++ - 如何为模板函数实现容器和迭代器的重载?

c# - 如何使用匿名方法初始化静态只读变量?

c++ - 如何定义静态常量成员?

c++ - 如何将大型二进制文件写入磁盘

c++ - 运行时抛出的 std::regex_error 异常

c++ - this 在静态成员函数的未计算上下文中