如何更喜欢 `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; }
修复了问题。现在您的运算符更匹配,因为它不需要转换。
当同时定义了 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; }
修复了问题。现在您的运算符更匹配,因为它不需要转换。