Где в этом коде вызов 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, но это было бы довольно странно.

Я не уверен в своем ответе. Но когда вы создаете экземпляр шаблона, компилятор реализует все функции, определенные в шаблоне (даже если они не используются). Таким образом, вы получаете сообщение об ошибке, даже если функция не используется.

Не могли бы вы дать полное сообщение об ошибке?

РЕДАКТИРОВАТЬ С полным сообщением об ошибке, вы получите проблему! Как вы сказали, у вашего объекта нет конструктора по умолчанию. Однако, чтобы использовать карту, вам нужен конструктор по умолчанию (как этого требует оператор функции [] для создания экземпляра при использовании нового ключа), даже если вы не используете функцию, она будет быть реализован компилятором.

Другие вопросы по тегам