隐式转换为 std::string
Implicit conversion to std::string
可能的重复项:
通过隐式转换为字符串流式传输对象时过载解析失败
我知道这样做不是一个好主意,但我真的很想知道下面的代码无法编译的原因(即为什么"没有可接受的转换"):
#include <iostream>
#include <string>
class Test
{
public:
operator std::string () const;
};
Test::operator std::string () const
{
return std::string("Test!");
}
int main ()
{
std::string str = "Blah!";
std::cout << str << std::endl;
Test test;
str = test;//implicitly calls operator std::string without complaining
std::cout << str << std::endl;
std::cout << test;//refuses to implicitly cast test to std::string
return 0;
}
在Visual Studio 2010上,我收到此错误:"error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'Test' (or there is no acceptable conversion)
<<
运算符是否隐式地将std::string
转换为其他内容以使用它?如果是,我需要在我的类中重载什么运算符才能使这样的事情工作?我拒绝相信我实际上需要使用operator char *
.
operator<<(std::basic_ostream&, std::basic_string)
是一个函数模板,在模板参数推导期间不考虑用户定义的转换。您需要为类重载operator<<
。
当然,另一种选择是演员阵容
std::cout << static_cast<std::string>(test);
问题是std::string
是模板的专用化,std::basic_string<char>
,而所需的operator<<
重载本身就是一个模板:
template<class charT, class traits, class Allocator>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>&& os,
const basic_string<charT,traits,Allocator>& str);
为了用于模板参数推导,用户定义的类型必须是完全匹配的;不考虑转换。
您需要为类提供重载operator<<
,或显式转换为 std::string
。
这取决于类的流插入运算符<<
是具体函数还是模板。
将<<
作为具体函数,找到重载并完成转换(只要它不模棱两可):
#include <iostream>
using namespace std;
template< class CharType >
struct String {};
ostream& operator<<( ostream& stream, String<char> const& s )
{
return (stream << "s");
}
struct MyClass
{
operator String<char> () const { return String<char>(); }
};
int main()
{
cout << "String: " << String<char>() << endl;
cout << "MyClass: " << MyClass() << endl;
}
但是,将<<
作为函数模板时,模板匹配找不到匹配项,并且不会尝试通过用户定义的运算符进行转换:
#include <iostream>
using namespace std;
template< class CharType >
struct String
{
};
template< class CharType >
ostream& operator<<( ostream& stream, String< CharType > const& s )
{
return (stream << "s");
}
struct MyClass
{
operator String<char> () const { return String<char>(); }
};
int main()
{
cout << "String: " << String<char>() << endl;
cout << "MyClass: " << MyClass() << endl; // !Oops, nyet! Not found!
}
就您而言,std::string
实际上只是std::basic_string<char>
的typedef
.
修复:为您的类定义一个<<
运算符,或者,如果您想避免标头依赖(考虑构建时间),请定义一个转换为例如 char const*
,或者,最简单的,我建议的,使该转换成为命名的转换,以便必须显式调用它。
显式是好的,隐式是坏的。
重写operator<<
方法。
std::ostream & operator <<(std::ostream & os, const Test & t) {
return os << std::string(t);
}
我认为您需要覆盖的运算符是"<<"。
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- std中有类似find_last_of的函数,而string中没有
- 使用 std::string () const 函数启动线程或未来
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 如何更改大小(std::string)
- std::string 的对象真的可以移动吗?
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 无法从 std::string 中提取C++ Unicode 符号
- std::string 构造函数如何处理固定大小的 char[]?
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- C++:考虑C++ std::string 中双引号 (") 的字面含义,而不使用反斜杠 (\)
- 'int main(int, int, std::__cxx11::string, std::__cxx11::string)'只需要零或两个参数 [-Wmain]
- C++ 在列表和列表之间选择返回类型<<string>std::p air<string,string>>
- std::string, std::wstring and UTF8
- uan inplace replacement of std::string/std::wstring?
- #define Glib::string std:wstring
- 从 std::string & std::wstring 中获取 char 整数值
- BSTR转换为std::string(std::wstring),反之亦然