C++模板静态成员实例化

mrs*_*mrs 15 c++ static templates instantiation member

#include <map>
#include <iostream>
template <typename T>
class A 
{
 static std::map<int, int> data;
public:
 A()
 {
  std::cout << data.size() << std::endl;
  data[3] = 4;
 }
};

template <typename T>
std::map<int, int> A<T>::data;

//std::map<int, int> A<char>::data;

A<char> a;

int main()
{
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

这有什么问题?如果没有明确的实例化,它就会破坏

 data[3] = 4; 
显式实例化解决了问题但程序在之后中断
std::cout << data.size() << std::endl;
什么意思是静态类模板memeber data被实例化.

Jac*_*oyd 2

我手边没有 Visual C++,但我可以看到使用 GCC 编译的代码也存在同样的问题。您需要初始化数据成员:

template<> std::map<int, int> A<char>::data = std::map<int, int>();
Run Code Online (Sandbox Code Playgroud)

通过此更改,它可以正确编译并运行(对于我来说,在 Linux 上的 GCC 上)。