我试图重载小于运算符,以便使用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;的左手操作数。 (或者没有可接受的转换)
...当我从右到左超载操作员时,我不知道为什么。为什么我需要走另一条路?
非常感谢
亚历
答案 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进行比较的有效方法。