Где в этом коде вызов std :: map :: operator []? - PullRequest
3 голосов
/ 26 февраля 2010

В моем коде есть следующие 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?

Ответы [ 3 ]

1 голос
/ 26 февраля 2010

Код, который вы опубликовали, прекрасно работает и без ошибок компилируется в строке for в компиляторах GCC и Comeau (Onlie). Прямо сейчас, к сожалению, у меня нет возможности попробовать это в VS2008.

Если ошибка действительно вызвана строкой for, я бы заподозрил проблему в компиляторе. Есть вероятность, что реализация std::map<>::begin() или std::map<>::end() так или иначе зависит от std::map<>::operator[]() в VS2008, но это было бы довольно странно.

1 голос
/ 26 февраля 2010

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

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

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

0 голосов
/ 02 марта 2010

Дело закрыто. Оказывается, я действительно допустил ошибку кодирования, записав вызов operator[], но это было на сотни строк ниже в исходном файле, откуда и была сообщена ошибка. Очевидно, VS просто указал мне на первое использование переменной mapType вместо фактической точки, в которой он пытался создать экземпляр метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...