Где в этом коде вызов std::map::operator[]?
У меня есть следующие 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
на этой карте. Так почему я получаю сообщение об ошибке при попытке скомпилировать operator[]
за map
?
3 ответа
Дело закрыто. Оказывается, я действительно допустил ошибку кодирования, написав звонок operator[]
, но это были сотни строк ниже в исходном файле, откуда и была сообщена ошибка. Видимо VS только что указал мне на первое использование переменной mapType
вместо фактической точки, где он пытался создать экземпляр метода.
Код, который вы разместили, прекрасно работает и без ошибок компилируется на for
линия в компиляторах GCC и Comeau (Onlie). Прямо сейчас, к сожалению, у меня нет возможности попробовать это в VS2008.
Если ошибка действительно вызвана for
линия, я бы заподозрил проблему в компиляторе. Есть шанс, что реализация std::map<>::begin()
или же std::map<>::end()
как-то зависит от std::map<>::operator[]()
в VS2008, но это было бы довольно странно.
Я не уверен в своем ответе. Но когда вы создаете экземпляр шаблона, компилятор реализует все функции, определенные в шаблоне (даже если они не используются). Таким образом, вы получаете сообщение об ошибке, даже если функция не используется.
Не могли бы вы дать полное сообщение об ошибке?
РЕДАКТИРОВАТЬ С полным сообщением об ошибке, вы получите проблему! Как вы сказали, у вашего объекта нет конструктора по умолчанию. Однако, чтобы использовать карту, вам нужен конструктор по умолчанию (как этого требует оператор функции [] для создания экземпляра при использовании нового ключа), даже если вы не используете функцию, она будет быть реализован компилятором.