gpt4 book ai didi

c++ - 将 operator== 重载为带有模板参数的自由函数的语法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:01 33 4
gpt4 key购买 nike

我有一组多态类,例如:

class Apple {};
class Red : public Apple {};
class Green : public Apple {};

以及比较它们的自由函数:

bool operator==(const Apple&, const Apple&);
bool operator< (const Apple&, const Apple&);

我正在设计一个可复制的包装器类,它将允许我使用类 RedGreen作为 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()’

如何让它识别上面的运算符==?我怀疑答案可能是在某处添加一些隐式转换代码,但我不确定该怎么做。

最佳答案

您的模板声明为

template <typename Cat>
bool operator==(const Copy<Cat>& copy, const Cat& e)

这与 redCopy == Red() 不匹配因为Red()类型为 Red , 所以编译器推断出 Red作为第二个参数的类型,即 Cat = Red , 但随后它期望第一个参数的类型为 Copy<Red> ,它不是( redCopy 的类型是 Copy<Apple> )。

你真正想表达的是这样的东西

template <typename Cat>
bool operator==(const Copy<Cat>& copy, const something-that-derives-from-Cat& e)

最简单的方法是添加第二个模板参数:

template <typename Cat, typename DerivedFromCat>
bool operator==(const Copy<Cat>& copy, const DerivedFromCat& e)

当然,这不会让编译器强制执行 DerivedFromCat 实际上是从 Cat 派生的。如果你想要这个,你可以使用 boost::enable_if :

template <typename Cat, typename DerivedFromCat>
typename enable_if<is_base_of<Cat, DerivedFromCat>, bool>::type
operator==(const Copy<Cat>&, const DerivedFromCat& e)

但这可能有点矫枉过正......

关于c++ - 将 operator== 重载为带有模板参数的自由函数的语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6257265/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com