您好,在Visual Studio 2008中编译此代码后,我收到以下错误
#include<iostream>
#include<string>
using namespace std;
void main()
{
basic_string<wchar_t> abc("hello world");
cout<<abc;
return;
}
错误C2664:'std :: basic_string&lt; _Elem,_Traits,_Ax&gt; :: basic_string(std :: basic_string&lt; _Elem,_Traits,_Ax&gt; :: _ Has_debug_it)':无法从'const char [12]转换参数1 'to'std :: basic_string&lt; _Elem,_Traits,_Ax&gt; :: _ Has_debug_it'
错误C2679:二进制'&lt;&lt;' :找不到运算符,它采用类型为'std :: basic_string&lt; _Elem,_Traits,_Ax&gt;'的右手操作数(或者没有可接受的转换)
我做错了什么?
任何人都可以帮助我了解背后发生的事情吗? 感谢
答案 0 :(得分:3)
尝试:
错误C2664:
basic_string<wchar_t> abc(L"hello world");
错误C2679:
cout << abc.c_str();
(因为编译器不能/不会为每个用户创建的类型提供合适的重载。但是,由于这也是标准类型,即wstring
,我查找了相应的标题,发现没有合适的{{1这需要operator<<
或string
。)
并使用wstring
,因此您拥有:
int main
尽管如此,你真的应该使用int main(void)
{
basic_string<wchar_t> abc(L"hello world");
cout << abc.c_str() << endl;
return 0;
}
而不是重新发明轮子。
答案 1 :(得分:3)
wchar_t指定宽字符类型。默认情况下,一个指向文字字符串的const char指针不宽,但你可以告诉编译器将它作为一个宽字符数组加上前缀为'L'。
所以只需改为
basic_string<wchar_t> abc(L"hello world");
答案 2 :(得分:2)
问题在于你是在混合宽字符和(窄?)字符类型。
对于basic_string
,请使用:
// note the L"..." to make the literal wchar_t
basic_string<wchar_t> abc(L"hello world");
// note that basic_string is no longer wchar_t
basic_string<char> abc("hello world");
或同等的:
// wstring is just a typedef for basic_string<wchar_t>
wstring abc(L"hello world");
// string is just a typedef for basic_string<char>
string abc("hello world");
并将输出更改为也匹配:
cout << abc; // if abc is basic_string<char>
wcout << abc; // if abc is basic_string<wchar_t>