2012-06-15 6 views
0

У меня есть классПравильно перегружать двойные равные для класса вытекающего из станда :: вектор

class Item { 
    int _one; 
    int _two; 
    int _three; 
    // other stuff 
}; 

class ItemList : public std::vector<Item> { 
    // deriving from std vector because the ctor needs to 
    // perform some work in discriminating what gets added 
    // to the list 
}; 

Я читал многие из аргументов против вывода из станд :: вектора <> и я думаю, что я буду быть в порядке, потому что этот класс не должен быть получен. Я выставляю это на python, используя пакет индексирования ускорения, чтобы выступать в качестве списка python. Потому что мне нужен конструктор, чтобы сделать какую-то работу в устранении определенных элементов из списка во время строительства, я решил пойти по этому пути вместо того, чтобы делать то, что я сделал в другом месте в проекте:

class AnotherItem { 
    // class definition 
}; 
typedef std::vector<AnotherItem> AnotherItemList 

А потом выставить список с пакетом индексации индекса ускорения с использованием typedef. Все кажется хорошо, за исключением того, что у меня есть эта ошибка: Ошибка 2 ошибки C2678: двоичный '==': оператор не найден, который принимает левый операнд типа «Item» (или нет приемлемого преобразования)

Ошибка не исходит от библиотек boost, а что-то в коде алгоритма std. Я попытался добавить свой собственный перегруженный оператор ==, но это не устранило проблему. Это выглядит так:

class Item { 
    // earlier stuff 
    bool operator==(Item& rhs) { 
     return (_one == rhs._one && _two == rhs._two && _three == rhs._three); 
    } 
    bool operator!=(Item& rhs) { 
     return !(*this == rhs); 
    } 
}; 

Это не устранило проблему. Что мне не хватает? Эта ссылка here показывает, что оператор == для вектора НЕ является функцией-членом. Я попытался перегрузиться на «глобальном» уровне (например, не в пространстве имен), но это тоже не помогло. Итак, что мне не хватает?

Спасибо, Энди

+8

Ваша первая проблема связана с 'std :: vector' .. не наследуют от типов, которые не были наследованы. Вместо этого используйте композицию (т. Е. Сохраните 'std :: vector' внутри). –

+4

Вы должны сделать 'operator ==' и 'operator! =' Const-correct. (т. е. 'bool operator == (const Item & rhs) const {...') – Cornstalks

+0

Помимо обычного наследования от векторных проблем, говорит ли ошибка о том, что ожидается на RHS? И он дает какие-то близкие матчи? – juanchopanza

ответ

1

Надлежащие перегрузки == является

class Item 
{ 
    ... 
    bool operator==(const Item& rhs) const 
    { .... } 

    bool operator!=(const Item& rhs) const 
    { return !(*this==rhs); } 
}; 

Кроме того, быть уверен, что, поскольку std::vector не имеет виртуальные пользователей, производный ItelmList не может быть использован полиморфно против std::vector сам, в частности, не вызывать delete в отношении std :: vector *.

Я должен сказать, что это потому, что в противном случае я, и вы будете обречены на тха C++ communinty хотя в 30+ год опыта в программировании я никогда не никогданикогда видел станд :: вектор * или зЬй :: строка *. (И, следовательно, я действительно не знаю, что все «пугало» о том, как получить классы std: просто узнайте, что вы делаете, и дайте другим людям знать)

+1

Вы никогда не видели 'std :: vector *' или 'std :: string *'?Понятно, что вы ни разу не читали noob вопросы C++ здесь, на SO ;-) – Rook

+0

@Rook: :-))) +1! -BTW- Это нормально, когда noobs совершают ошибки. Что не так, защищает их. После того, как я узнал разницу между == и =, я прекратил кодирование «сравнение йоды» (например, if (0 == a) ...). После того, как я узнал о различии между виртуальными и нет, я прекратил обрекать не виртуальные dtors. –

+0

Похоже, у меня были проблемы с константой. Я перекодировал то, что я придерживаюсь этой схемой, и все построено. Тем не менее, учитывая эту мудрость. Хотя мой код теперь строит, я не уверен, что он останется таким, учитывая очень серьезные соображения, вытекающие из std :: vector <>. Этот класс никогда не должен быть получен. С другой стороны, мне сказали, что мне больше не понадобится больше 640 тыс. Оперативной памяти. –

Смежные вопросы