1

別のクラスでTableあるメンバー関数を持つクラスがあります。std::vector<Attribute> attributeVec();Attribute

私はフォームの何かをしたいコードで作業しています

if (tableA.attributeVec() == tableB.attributeVec()){ ...

tableAtableBはオブジェクト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 を考えると) について不当な仮定をしていると思いますが、これを私のコードに実装しても害はありません。

ありがとう!

4

4 に答える 4

2

クラスoperator==に実装する必要があります:Attribute

class Attribute {
  bool operator== (const Attribute& other) const {
   // return true if *this == other, otherwise return false
  }
}

attributeVec()ところで: juanchopanza が気付いたように、関数のコピーではなく、関数からベクターへの参照のみを返すことができる可能性があります。

std::vector<Attribute>& attributeVec();

それはより効率的でありoperator==、式で(を使用して)比較します。

o1.attributeVec() == o2.attributeVec()

まだ正常に動作します。

于 2013-02-19T22:47:58.933 に答える
2

ベクトルは を使用して比較できます==が、含まれる型 (Attributeこの場合) には comparison が必要operator==です。それをクラスに与えるとAttribute、比較が機能するはずです。

関係のない話ですが、彼の方法は

std::vector<Attribute> attributeVec();

ベクトルのコピーを返しています。これが本当に望んでいる動作であるかどうかを考える必要があります。

于 2013-02-19T22:48:04.763 に答える
1

を見てくださいstd::equal。2 番目の形式では、独自の比較関数を指定できます。

例:

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()を返します。このように記述できない場合は、andを参照として定義しないでください。(この場合、のベクトルを生成する必要のないの比較関数を作成することを検討してください。)attribsAattribsBTableAttribute

于 2013-02-19T23:11:11.913 に答える
1

エラーは基本的に自明でありoperator==、 onが必要Attributeです。

于 2013-02-19T22:49:03.913 に答える