【发布时间】:2011-04-11 22:09:15
【问题描述】:
#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;
}
这有什么问题?如果没有显式实例化,它会在
处中断数据[3] = 4;显式实例化解决了问题,但是程序在
std::cout 意味着静态类模板成员data被实例化了。
【问题讨论】:
-
什么编译器?我不认为这是你的错。
-
使用 VS2010 可以正常编译。
-
我正在使用 vs2008,它确实可以编译,但程序在行 data[3] = 4 处中断
-
@mrs:啊,我没有仔细看你的代码。在
vector至少调整为4大小之前,您无法访问data[3]。另一方面,data.push_back(4)增加data的大小并初始化新元素。所以,如果改成data.push_back()后无论如何都能正常工作,那毕竟不是编译器的问题。 -
@Potatoswatter 容器是地图,不是向量;不需要调整大小。
标签: c++ templates static instantiation member