次のようなポリモーフィッククラスのセットがあります。
class Apple {};
class Red : public Apple {};
class Green : public Apple {};
そしてそれらを比較する無料の機能:
bool operator==(const Apple&, const Apple&);
bool operator< (const Apple&, const Apple&);
コピー可能なラッパークラスを設計しています。これにより、ポリモーフィックな動作を維持しながら、クラスを使用Red
しGreen
たり、STLマップのキーとして使用したりできます。
template<typename Cat>
class Copy
{
public:
Copy(const Cat& inCat) : type(inCat.clone()) {}
~Copy() { delete type; }
Cat* operator->() { return type; }
Cat& operator*() { return *type; }
private:
Copy() : type(0) {}
Cat* type;
};
タイプはできるだけCopy<Apples>
互換性があるようにしたいと思います。Apples
上記のクラスに追加する必要のある関数は他にもいくつかありますがCopy
、今のところ、次のように、の無料関数に取り組んでoperator==
います。
template<typename Cat>
bool operator==(const Copy<Cat>& copy, const Cat& e) {
return *copy == e;
}
これが私のテストコードの一部です:
Red red;
Copy<Apple> redCopy = red;
Copy<Apple> redCopy2 = redCopy;
assert(redCopy == Red());
しかし、コンパイラは私に言っています
../src/main.cpp:91: error: no match for ‘operator==’ in ‘redCopy == Red()’
上記のoperator==を認識させるにはどうすればよいですか?答えは、暗黙の変換コードをどこかに追加することかもしれないと思いますが、どうしたらよいかわかりません。