在c++11中使用用户定义的转换进行重载运算符推导

overloaded operator deduction using user-defined conversions in c++11

本文关键字:换进 重载 运算符 转换 c++11 定义 用户      更新时间:2023-10-16

我的问题可能与http://en.cppreference.com/w/cpp/language/overload_resolution#Call_to_an_overloaded_operator.但在我的情况下,我有const复杂的类型:

class Complex {
public:
   int data;
   Complex(int i) : data(i) {}
   bool operator < (const Complex& other) const { return data < other.data; }
};
class Holder {
public:
    Complex data;
    Holder(int i) : data(i) {}
    operator const Complex&() const { return data; }
};
//...
Holder a(1), b(2);
assert(a < b); //Error 

g++4.9:no match for ‘operator<’ (operand types are ‘Holder‘ and ‘Holder‘) 中的编译器错误

知道怎么解决这个问题吗?

Btw。我需要这种转换来只允许转换为const类型。

成员比较运算符不允许在左侧进行隐式转换,您需要将运算符设置为非成员函数:

class Complex {
public:
   int data;
   Complex(int i) : data(i) {}
};
bool operator < (const Complex& lhs, const Complex& rhs) 
{ return lhs.data < rhs.data; }

实时演示

a < b等价于a.operator<(b)

a属于Holder类型,并且没有名为operator<的函数。

对成员函数的函数调用不会触发从HolderComplex的隐式转换。

如果您手动将a转换为const Complex&,您的功能将起作用:

assert(((const Complex&)a) < b);