繁体   English   中英

重载少于具有不同类型的运算符

[英]Overloading less than operater with different types

我正在尝试重载小于运算符,以便使用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()

返回double但可以在std::vector<ClassA>; 当它取消引用迭代器时,我在GCC 4.8.3中遇到错误,因为它无法将ClassA转换为double。 但是,如果我将强制转换运算符添加到ClassA中,例如:

operator double () { 
    return one; 
}

std::lower_bound(vec.begin(),vec.end(), 20.0); 对我来说完全不需要任何自定义的运算符,因为现在编译器知道了将ClassA与double进行比较的有效方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM