过载小于不同类型的操作器
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()
返回双精度但适用于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进行比较的有效方法。
- 打印矩阵后分割错误,但在打印额外行后修复(ostream <<操作器)
- 使用“decltype”获取迭代器的类型
- 在模板上使用() - 操作器
- 操作器 [] 作为非静态函数
- 错误:如果(object1 == object2),“操作器==”无匹配(操作数类型为“ const class”和“
- 过载复合"+="操作器作为自由功能
- Wireshark解剖器空隙类型
- 三元操作的结果(类型)是什么
- 枚举声明中的枚举器的类型
- 无法通过此操作,因为类型的错误转换
- C# * 和 & 操作器,用于指向数组
- 什么是有效的寄存器变量类型
- 方括号和圆括号操作器,如何选择重载
- 为什么C 流操作器没有呼叫操作员
- 产生算术操作的结果类型的政策
- 使用函数操作结构数据类型的值
- 如何使C++endl操作器线程安全
- 从模板函数中取消引用的迭代器推断类型
- LNK 2019 尝试重载"<<"操作器时出错
- 过载小于不同类型的操作器