如何更喜欢 `operator<<` 而不是通用的 `operator T()` 转换?

How to prefer `operator<<` over generic `operator T()` conversion?

当同时定义了 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;
}

您自己的运算符不可行,因为它需要 foo by non-const ref 临时无法绑定到。因此,首先考虑 post-转换重载。

将其声明更改为

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

修复了问题。现在您的运算符更匹配,因为它不需要转换。