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

我已经阅读了许多反对从 std::vector<> 派生的论点,我想我会没事的,因为这个类不是派生自。我在 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);
    }
};

这并没有解决问题。我错过了什么?此处的此链接显示向量的 == 运算符不是成员函数。我尝试在“全局”级别重载(即不在命名空间内),但这也无济于事。那么,我错过了什么?

谢谢,安迪

4

1 回答 1

1

== 的正确重载是

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

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

另外,请注意,因为std::vector没有虚拟成员,所以您的派生ItelmList不能对std::vector自身进行多态使用,特别是不要对 std::vector* 调用 delete。

我必须这样说,否则我和你将注定被 C++ 社区所毁灭,尽管在 30 多年的编程经验中,我从未见过 std ::vector* 或 std::string*。(因此我真的不知道派生 std 类的所有“恐惧”是关于:只需知道你在做什么并让其他人知道)

于 2012-06-15T15:26:27.987 回答