在 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; }
a < b
等同于 a.operator<(b)
.
a
是类型 Holder
并且没有名为 operator<
.
的函数
对成员函数的函数调用不会触发从 Holder
到 Complex
的隐式转换。
如果您手动将 a
转换为 const Complex&
,您的函数将起作用:
assert(((const Complex&)a) < b);
我的问题可能与 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; }
a < b
等同于 a.operator<(b)
.
a
是类型 Holder
并且没有名为 operator<
.
对成员函数的函数调用不会触发从 Holder
到 Complex
的隐式转换。
如果您手动将 a
转换为 const Complex&
,您的函数将起作用:
assert(((const Complex&)a) < b);