#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;
}
这里有什么问题?如果没有显式实例化,在
data[3] = 4;处会出错。显式实例化解决了这个问题,但在
std::cout << data.size() << std::endl;后程序会出错,这意味着静态类模板成员
data
已被实例化。
vector
大小调整至至少为4
之前,您无法访问data[3]
。 另一方面,data.push_back(4)
会增加data
的大小并初始化新元素。因此,如果更改为data.push_back()
后在任何情况下都正常工作,则不是编译器的问题。 - Potatoswatterpush_back
替换[]
可以解决问题,但是map
甚至没有push_back
。所以这有点可疑。要么是一个极其原始不兼容的实现,带有map
中的“奖励”方法,要么是OP没有向我们展示某些东西。 - Potatoswatter