不能 std::cout 隐式转换 std::string
Cannot std::cout an implicitly converted std::string
我以前用std::cout << str << std::endl
来显示一个字符串,我认为隐式转换为std::string
的对象也可以用这种方式显示。
然而,我发现我错了。在为 std::string.
重载 operator <<
之前,我无法 std::cout
隐式转换 std::string
以下代码演示了上述内容。
#include <stdio.h>
#include <iostream>
#include <string>
class X
{
public:
operator std::string() const {
return std::string("world");
}
};
#ifdef OVERLOAD_STREAM_OP
std::ostream& operator<<(std::ostream& os, const std::string& s) {
return os << s;
}
#endif
int main() {
std::string s = "hello";
std::cout << s << std::endl; // viable
printf("---\n");
X x;
std::cout << x << std::endl; // not viable
return 0;
}
似乎在STL实现中,std::string类型的重载operator <<
函数有点不同(但我真的不明白那些模板的东西):
template<typename _CharT, typename _Traits, typename _Allocator>
std::basic_ostream<_CharT, _Traits>&
operator<<(std::basic_ostream<_CharT, _Traits>& __os,
const basic_string<_CharT, _Traits, _Allocator>& __str)
{ return __os << __str._M_base(); }
我的问题:
STL重载的operator <<
和我自己重载的std::string
类型的operator<<
有什么区别?
为什么我不能用std::cout
显示隐式转换的std::string对象x
(编译错误)?
- What is the difference between STL's overloaded
operator <<
and my own overloaded operator<<
for std::string type?
你的operator<<
是非模板,而STL的是模板。
- Why I cannot display the implicitly converted
std::string
object x with std::cout
(compile error)?
在 template argument deduction 中不会考虑隐式转换(从 X
到 std::string
),这会导致对模板 operator<<
的调用失败。另一方面,非模板 operator<<
没有这样的问题。
Type deduction does not consider implicit conversions (other than type adjustments listed above): that's the job for overload resolution, which happens later.
我以前用std::cout << str << std::endl
来显示一个字符串,我认为隐式转换为std::string
的对象也可以用这种方式显示。
然而,我发现我错了。在为 std::string.
重载operator <<
之前,我无法 std::cout
隐式转换 std::string
以下代码演示了上述内容。
#include <stdio.h>
#include <iostream>
#include <string>
class X
{
public:
operator std::string() const {
return std::string("world");
}
};
#ifdef OVERLOAD_STREAM_OP
std::ostream& operator<<(std::ostream& os, const std::string& s) {
return os << s;
}
#endif
int main() {
std::string s = "hello";
std::cout << s << std::endl; // viable
printf("---\n");
X x;
std::cout << x << std::endl; // not viable
return 0;
}
似乎在STL实现中,std::string类型的重载operator <<
函数有点不同(但我真的不明白那些模板的东西):
template<typename _CharT, typename _Traits, typename _Allocator>
std::basic_ostream<_CharT, _Traits>&
operator<<(std::basic_ostream<_CharT, _Traits>& __os,
const basic_string<_CharT, _Traits, _Allocator>& __str)
{ return __os << __str._M_base(); }
我的问题:
STL重载的
operator <<
和我自己重载的std::string
类型的operator<<
有什么区别?为什么我不能用
std::cout
显示隐式转换的std::string对象x
(编译错误)?
- What is the difference between STL's overloaded
operator <<
and my own overloadedoperator<<
for std::string type?
你的operator<<
是非模板,而STL的是模板。
- Why I cannot display the implicitly converted
std::string
object x withstd::cout
(compile error)?
在 template argument deduction 中不会考虑隐式转换(从 X
到 std::string
),这会导致对模板 operator<<
的调用失败。另一方面,非模板 operator<<
没有这样的问题。
Type deduction does not consider implicit conversions (other than type adjustments listed above): that's the job for overload resolution, which happens later.