正确地为从std :: vector派生的类重载double equals

时间:2012-06-15 15:03:38

标签: c++ boost boost-python

我有一个班级

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
};

我已经阅读了很多反对派生于std :: vector&lt;&gt;的论据。而且我想我会好的,因为这个课不是来自。我在python中公开了这个,使用boost向量索引套件,充当python列表。因为我需要构造函数在构建期间从列表中删除某些元素做一些工作,所以我决定采用这条路线而不是做我在项目中其他地方所做的事情:

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

然后使用typedef使用boost矢量索引套件公开列表。一切似乎都很好,除了我有这个错误:错误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显示向量的==运算符不是成员函数。我尝试在“全局”级别(即不在命名空间内)进行重载,但这也无济于事。那么,我错过了什么?

谢谢, 安迪

1 个答案:

答案 0 :(得分:1)

==的正确重载是

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

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

另外,请注意,因为std::vector没有虚拟成员,所以您的派生ItelmList不能以多态方式用于std::vector本身,特别是不要对其进行调用删除的std ::矢量*。

我不得不这样说,因为否则我和你将会注定被C ++共存,尽管在30多年的编程经验中我永远不会 永远不会 看到了std :: vector *或std :: string *。 (因此我真的不知道所有关于推导std课程的“恐慌”是:只知道你在做什么并让其他人知道)