我有一个班级
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显示向量的==运算符不是成员函数。我尝试在“全局”级别(即不在命名空间内)进行重载,但这也无济于事。那么,我错过了什么?
谢谢, 安迪
答案 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课程的“恐慌”是:只知道你在做什么并让其他人知道)