нет совпадения для оператора = с использованием std :: vector - PullRequest
2 голосов
/ 15 июня 2010

У меня есть класс, объявленный так:

class Level
{
    private:
        std::vector<mapObject::MapObject> features;
    (...)
};

, и в одной из его функций-членов я пытаюсь перебрать этот вектор следующим образом:

vector<mapObject::MapObject::iterator it;
for(it=features.begin(); it<features.end(); it++)
{
    /* loop code */
}

Это кажетсядля меня это просто, но g ++ дает мне такую ​​ошибку:

src/Level.cpp:402: error: no match for ‘operator=’ in ‘it = ((const yarl::level::Level*)this)->yarl::level::Level::features.std::vector<_Tp, _Alloc>::begin [with _Tp = yarl::mapObject::MapObject, _Alloc = <code>std::allocator<yarl::mapObject::MapObject>]()’
/usr/include/c++/4.4/bits/stl_iterator.h:669: примечание: кандидаты: __gnu_cxx::__normal_iterator<yarl::mapObject::MapObject*, std:: vector>> & __gnu_cxx::__normal_iterator<yarl::mapObject::MapObject*, std :: vector> >::operator=(const __gnu_cxx::__normal_iterator<yarl::mapObject::MapObject*, ``std::vector<yarl::mapObject::MapObject, std::allocator<yarl::mapObject::MapObject> > >&)

Кто-нибудь знает, почему это происходит?

Ответы [ 4 ]

15 голосов
/ 15 июня 2010

Я предполагаю, что эта часть ошибки описывает вашу проблему:

(const yarl::level::Level*)this

Является ли функция-член, в которой этот код найден, функцией-константой?Если это так, вам нужно будет использовать const_iterator:

vector<mapObject::MapObject>::const_iterator it;

Если функция-член имеет константную квалификацию, то только константные перегрузки begin() и end() на элементевектор будет доступен, и оба из них возвращают const_iterator s.

2 голосов
/ 15 июня 2010

Вы закрыли здесь свою угловую скобку?

vector<mapObject::MapObject::iterator it;

Если вы хотите вектор объектов, вашему объекту нужен оператор =. У MapObject есть такой? Если нет, рассмотрим вектор указателей на MapObject.

0 голосов
/ 12 сентября 2012

@ Ответ Джеймса Макнеллиса (лучший ответ с «зеленой галочкой») исправил мою ошибку с похожим описанием, однако моя ошибка была вызвана тем, что @tmarthal упомянул его ответный пост (без определения оператора присваивания).Его предлагаемое исправление состоит в том, чтобы включить оператор присваивания, но я просто хотел добавить, что я также смог исправить эту ошибку, используя std :: vector <> :: const_iterator вместо std :: vector <> :: iterator для классов, где нет присваиванияОператор определен.Я не уверен, действительно ли это правильное исправление или просто что-то, что мешало компилятору пожаловаться.

0 голосов
/ 15 июня 2010

На вашем месте я бы проверил, что mapObject :: MapObject имеет конструктор по умолчанию и открытый оператор присваивания.

Где-то в заголовке класса вы должны увидеть что-то вроде:

public:
    MapObject();
    operator=(const MapObject &mapObject);

Это означает, что класс имеет конструктор по умолчанию и оператор присваивания.

Создание экземпляра std :: vector невозможно с использованием класса без конструктора по умолчанию, и вы не можете выполнить итерацию по классу каквыше без оператора присваивания.

Итак, добавьте оператор присваивания в определение класса, и ваша итерация скомпилируется.

...