У меня есть набор полиморфных классов, таких как:
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()’
Как мне узнать, что мой оператор == выше? Я подозреваю, что ответ может быть в добавлении некоторого неявного кода преобразования где-то, но я не уверен, что делать.