如果同时定义了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;
}
答案 0 :(得分:3)
您自己的运算符不可行,因为临时无法绑定的非foo
引用const
。因此,首先考虑转换后的重载。
将声明更改为
friend std::ostream& operator <<(std::ostream& out, const foo& f) { return out << f.x; }
解决了这个问题。现在您的运营商是更好的匹配,因为它不需要转换。