0

嗨,在 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<_Elem,_Traits,_Ax>::basic_string(std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it)' : 无法将参数 1 从 'const char [12]' 转换为' std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it'

错误 C2679:二进制“<<”:未找到采用“std::basic_string<_Elem,_Traits,_Ax>”类型的右侧操作数的运算符(或没有可接受的转换)

我做错了什么?

谁能帮我理解背后发生的事情?谢谢

4

3 回答 3

3

尝试:

错误 C2664:

basic_string<wchar_t> abc(L"hello world");

错误 C2679:

cout << abc.c_str();

(由于编译器不能/不会为每个用户创建的类型提供合适的重载。但是,由于这也是标准类型,即 ie wstring,我查找了适当的标头,发现没有合适operator<<的采用 astring或 a wstring。)

和使用int main,所以你有:

int main(void)
{        
     basic_string<wchar_t> abc(L"hello world");
     cout << abc.c_str() << endl;
     return 0;
}

不过,您确实应该使用std::wstring而不是重新发明轮子。

于 2009-04-02T11:22:38.173 回答
3

wchar_t 指定宽字符类型。默认情况下,指向文字字符串的 const char 指针不是宽的,但您可以通过在其前面加上 'L' 来告诉编译器将其视为宽字符数组。

所以只需更改为

basic_string<wchar_t> abc(L"hello world");
于 2009-04-02T11:28:24.727 回答
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>
于 2009-04-03T17:17:53.420 回答