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 で公開し、ブースト ベクター インデックス作成スイートを使用して、Python リストとして機能させます。構築中にリストから特定の要素を削除するためにコンストラクターが何らかの作業を行う必要があったため、プロジェクトの他の場所で行ったことを行う代わりに、このルートに進むことにしました。

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

次に、typedef を使用してブースト ベクター インデックス スイートでリストを公開します。このエラーがあることを除いて、すべてうまくいくようです: エラー 2 エラー C2678: バイナリ '==' : タイプ 'Item' の左側のオペランドを取る演算子が見つかりません (または、受け入れ可能な変換がありません)

エラーはブースト ライブラリからではなく、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*を見たことがありません。 (したがって、私は実際に、性感染症のクラスを導出することについてのすべての「恐怖」が何であるかを知りません:単にあなたが何をしているのかを知り、他の人に知らせてください)

于 2012-06-15T15:26:27.987 に答える