重载模板类比较运算符

时间:2018-03-28 20:02:05

标签: c++

我在C ++中重载比较运算符时遇到了很多麻烦。我不认为我做得对,任何帮助表示赞赏。我在下面提供了我班级的片段。

template <typename T>
class A
{
public:
    template <typename T>
    bool operator<  (const A<T>& rhs) const {
        return (value < rhs);
    }
private:
    T value;
};

4 个答案:

答案 0 :(得分:1)

如果您希望使用相同类型A对两个T对象进行参数化,请删除运算符上的内部template <typename T>

否则,如果您希望运营商使用与A不同的类型参数T,请将内部template <typename T>更改为template <typename U>,然后更改{{1}转到rhs

答案 1 :(得分:1)

您无法使用相同的参数名称定义嵌套模板。

如果order_subtotal = order.items.map{|item| item.price * item.quantity}.reduce(:+) 接受operator<对象,其模板参数为不同类型,然后与要比较的A对象,则必须使用不同的模板参数名称:

A

只要template <typename T> class A { public: template <typename Other> bool operator< (const A<Other>& rhs) const { return (value < rhs.value); } private: T value; }; T类型与Other相当,就可以使用此功能。

但是,如果您要比较具有相同模板类型的两个<对象,则A根本不需要拥有自己的模板:

operator<

答案 2 :(得分:0)

如果您想支持简单的用例,例如:

A<int> a = { some_value };
A<int> b = { some_other_value } ;

if ( a < b ) { ... }

operator<函数不需要是成员函数模板。您可以将代码简化为:

template <typename T>
class A
{
  public:
    bool operator<(const A& rhs) const {
        return (value < rhs.value);
    }
  private:
    T value;
};

如果您希望能够使用:

A<int> a = { some_value };
A<float> b = { some_other_value } ;

if ( a < b ) { ... }

然后operator<函数需要是成员函数模板。但是,请确保两个模板参数名称不同。您可以使用:

template <typename T>
class A
{
  public:
    template <typename T1>
    bool operator<(const A<T1>& rhs) const {
        return (value < rhs.value);
    }  
  private:
    T value;
};

只要TT1支持此类操作,这将有效。

答案 3 :(得分:0)

我不确定您是否需要两个不同的模板参数或一个。这是只有一个typename的解决方案(我还添加了getter for value,因为我更喜欢)。您不需要在模板内部定义,您需要比较实例的值,而不仅仅是值和实例A.

template <typename T>
class A {
public:
    bool operator < (const A<T> & rhs) const {
        return (value < rhs.getValue());
    }

   const T & getValue() const{
        return this -> value;
    }
private:
    T value;
};

如果你想要两个模板参数,那就更复杂了。除非你只有几个类需要像这样工作,你可以做&lt;每个人的操作员。否则它可能会变得混乱,我相信你会想要做更好的解决方案。