过载小于不同类型的操作器

Overloading less than operater with different types

本文关键字:操作器 同类型 小于      更新时间:2023-10-16

我正在尝试重载小于运算符,以便使用 vector::lower_bound 在 ClassA 类型的向量中找到与给定双精度值的最接近/最接近的数字。如果我给它 2 个 ClassA 实例进行比较,但不能与不同类型的实例进行比较,我可以让它工作。

我有以下代码

double ClassB::findNearest()
{
     std::vector<ClassA> vec;
     std::vector<ClassA>::iterator low;
     low = std::lower_bound(vec.begin(),vec.end(), 20.0);
     if (low == vec.end())
     {
          return -1;
     }
     return *low;
}

-----------------------------------------------------

class ClassA
{
public:
   ClassA(void);
   virtual ~ClassA(void);
   double one;
   double two;
    inline friend bool operator< ( const ClassA &cC1, const double &cC2)
    { 
         return cC1.one < cC2 ;
    };
};

我收到错误:二进制"<":未找到采用类型为"const double"的左操作数的运算符(或者没有可接受的转换)

。我不知道为什么当我从右到左重载运算符时。为什么我需要走另一条路?

非常感谢

亚历克斯

std::lower_bound正在寻找:bool operator< (const double& cC1, const ClassA& cC2)

你应该简单地在你的ClassA定义它,你就会成为金色的:

bool operator< (const double& cC1, const ClassA& cC2)
{
    return cC1 < cC2.one;
}

编辑:leemes是对的,这需要在Class A之外定义,以便std::lower_bound可以访问。

一个简单的解决方法是提供一个非成员函数(如果你要将数据字段设为私有,也许是一个朋友):

class ClassA
{
public:
    //as before...
    inline friend bool operator< ( const double &cC1, const ClassA &cC2)
    { 
         return cC1 < cC2.one ;
    };
};

这感觉有点乱。如果我们要求std::lower_bound找到ClassA的下限,我们就不需要专注于哪种方式来做到这一点。

我们可以通过让构造函数采用double来允许隐式转换

CLassA(double x): one(x), two(0.0) {}

斯科特·迈耶斯(Scott Meyers)详细讨论了这个问题(例如,第24项有效C++)。当我们不想要它时,这可能会以临时结束,但确实允许与非成员运算符对称。

或者,具有具有ClassA与自己的类型的比较功能,并为lower_boud制作合适的 ClassA,例如 ClassA(20.0, 0.0)。

不知何故,我觉得你的代码可能不完整。您的职能

double ClassB::findNearest()

返回双精度但适用于std::vector<ClassA>; 当它取消引用迭代器时,我在 GCC 4.8.3 中收到错误,因为它无法将 ClassA 转换为双精度。但是,如果我在 ClassA 中添加一个转换运算符,例如:

operator double () { 
    return one; 
}

std::lower_bound(vec.begin(),vec.end(), 20.0);对我有用,根本没有任何自定义的less运算符,因为现在编译器知道将ClassA与double进行比较的有效方法。