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

时间:2014-11-25 15:49:38

标签: c++ overloading operator-keyword

我试图重载小于运算符,以便使用vector :: lower_bound在类型ClassA的向量中找到最接近/最接近的数字给定的double。 我可以让它工作,如果我给它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 ;
    };
};

我收到错误: 二进制&#39;&lt;&#39; :找不到哪个运算符采用类型为&#39; const double&#39;的左手操作数。 (或者没有可接受的转换)

...当我从右到左超载操作员时,我不知道为什么。为什么我需要走另一条路?

非常感谢

亚历

3 个答案:

答案 0 :(得分:1)

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可以访问。

答案 1 :(得分:0)

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

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详细讨论了这个问题(例如Item 24 Effective C ++)。当我们不想要它时,这可能会结束临时性,但是允许与非成员运营商形成对称。

或者,为ClassA提供一个具有自己类型的比较函数,并为lower_boud制作合适的ClassA,例如: ClassA(20.0,0.0)。

答案 2 :(得分: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进行比较的有效方法。