В моем коде есть следующие 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
aka map<ulint, particle>
, и я звоню только begin()
и end
на этой карте. Так почему я получаю сообщение об ошибке при попытке скомпилировать operator[]
для map
?