[英]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.