我有一个班级Table
,其成员函数std::vector<Attribute> attributeVec();
,其中Attribute
是一个单独的类。
我正在使用想要执行
形式的代码if (tableA.attributeVec() == tableB.attributeVec()){ ...
其中tableA
和tableB
是Table
个对象。
我在Visual Studio 2012中遇到了很多奇怪的编译器错误,比如
binary '==' : no operator found which takes a left-hand operand of type 'const DatabaseAPI::Attribute' (or there is no acceptable conversion)
所以我相信这些载体不能那样比较。 如果我能将这段代码编译成,这将使我的生活更轻松,但我怎么能这样做?我可以定义运算符吗?我是否需要重写一些Attribute
类,以便对它们进行比较?
细节:在编写API之后,我得到了一组测试,如果合理的话,需要工作。虽然我认为这至少会对我的代码做出不合理的假设(给定我的API),但在我的代码中实现它并没有什么坏处。
谢谢!
答案 0 :(得分:2)
您需要在operator==
课程中实施Attribute
:
class Attribute {
bool operator== (const Attribute& other) const {
// return true if *this == other, otherwise return false
}
}
顺便说一下:正如juanchopanza注意到的那样,你可能只能从attributeVec()
函数返回对向量的引用,而不是它的副本:
std::vector<Attribute>& attributeVec();
这会更有效,并且在表达式中进行比较(使用operator==
):
o1.attributeVec() == o2.attributeVec()
仍然可以正常工作。
答案 1 :(得分:2)
可以使用==
来比较向量,但是它们包含的类型(在这种情况下为Attribute
)必须具有比较operator==
。如果您将其提供给Attribute
类,则比较应该有效。
一个无关的说明,他的方法
std::vector<Attribute> attributeVec();
正在返回矢量的副本。你必须考虑这是否是你真正想要的行为。
答案 2 :(得分:1)
错误基本上是不言自明的,operator==
上需要Attribute
。
答案 3 :(得分:1)
看看std::equal
;第二种形式允许您指定自己的比较功能。
示例:
bool compareAttributes (const Attribute &a, const Attribute &b) { /* ... */ }
// assumes attributeVec() returns a reference; if not, then remove '&'
const std::vector<Attribute>& attribsA = tableA.attributeVec();
const std::vector<Attribute>& attribsB = tableB.attributeVec();
if(attribsA.size()==attribsB.size() &&
std::equal(attribsA.begin(), attribsA.end(),
attribsB.begin(), compareAttributes))
{ /* ... */ }
理想情况下,attributeVec()
会向属性向量返回引用。如果您不能这样写,那么attribsA
和attribsB
不应该被定义为引用。 (在这种情况下,您可以考虑为Table
编写一个不需要生成Attribute
向量的比较函数。)