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

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

我的问题可能与 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‘)

知道如何解决这个问题吗?

顺便说一句。我需要该转换以仅允许强制转换为 const 类型。

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

class Complex {
public:
   int data;

   Complex(int i) : data(i) {}
};

bool operator < (const Complex& lhs, const Complex& rhs) 
{ return lhs.data < rhs.data; }

Live Demo

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

a 是类型 Holder 并且没有名为 operator<.

的函数

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

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

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