我的代码中有以下 typedef:
typedef unsigned long int ulint;
typedef std::map<ulint, particle> mapType;
typedef std::vector< std::vector<mapType> > mapGridType;
particle
是没有默认构造函数的自定义类。
VS2008 在这段代码中给我一个错误:
std::set<ulint> gridOM::ids(int filter)
{
std::set<ulint> result;
ulint curId;
for ( int i = 0; i < _dimx; ++i ) {
for ( int j = 0; j < _dimy; ++j ) {
// next line is reported to be erroneous
for ( mapType::iterator cur = objectMap[i][j].begin(); cur != objectMap[i][j].end(); ++cur )
{
curId = (*cur).first;
if ( (isStatic(curId) && filter != 2) || (!isStatic(curId) && filter != 1) )
{
result.insert(curId);
}
}
}
}
return result;
}
objectMap
是 mapGridType
的对象.错误如下:
error C2512: 'gridOM::particle::particle' : no appropriate default constructor available
while compiling class template member function 'gridOM::particle &std::map<_Kty,_Ty>::operator [](const unsigned long &)'
with
[
_Kty=ulint,
_Ty=gridOM::particle
]
.\gridOM.cpp(114) : see reference to class template instantiation 'std::map<_Kty,_Ty>' being compiled
with
[
_Kty=ulint,
_Ty=gridOM::particle
]
如果我错了请纠正我,但上面的代码不应该调用 map::operator[]
根本。第一个operator[]
调用电话 vector< vector<mapType> >
并返回 vector<mapType>
, 第二个是 vector<mapType>
并返回 mapType
又名 map<ulint, particle>
, 我只调用 begin()
和 end
在那张 map 上。那么,为什么我在尝试编译 operator[]
时会出错?对于 map
?
最佳答案
我不确定我的答案。但是当你实例化一个模板时,编译器会实现模板中定义的所有函数(即使它们没有被使用)。因此,即使没有使用该功能,您也会收到错误消息。
能给出完整的错误信息吗?
编辑 有了完整的错误信息,您就明白了!如您所说,您的对象没有默认构造函数。但是,为了使用映射,您需要默认构造函数(因为函数 operator[] 需要它才能在使用新键时构建实例),即使您不使用该函数,它也会由编译器实现。
关于c++ - 这段代码中对 std::map::operator[] 的调用在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2341987/