如何更喜欢`operator<<`而不是泛型`运算符T()`转换?

时间:2016-02-22 22:59:53

标签: c++ operator-overloading overload-resolution

如果同时定义了operator <<(std::ostream&...和通用转化运算符template<typename T> operator T(),则std::cout << foo();不明确。有没有办法让这个决定调用operator <<

最短的工作代码:

#include<iostream>

struct foo {
    int x;
    template<typename T> operator T() { return static_cast<T>(x); }
    friend std::ostream& operator <<(std::ostream& out, foo& f) { return out << f.x; }
};

//std::ostream& operator <<(std::ostream& out, foo& f) { return out << f.x; } // doesn't help

int main() {
    std::cout << foo() << std::endl;
    return 0;
}

1 个答案:

答案 0 :(得分:3)

您自己的运算符不可行,因为临时无法绑定的非foo引用const。因此,首先考虑转换后的重载。

将声明更改为

friend std::ostream& operator <<(std::ostream& out, const foo& f) { return out << f.x; }

解决了这个问题。现在您的运营商是更好的匹配,因为它不需要转换。