在vc ++ 9.0中使用basic_string <wchar_t> abc(“hello”)时出现错误c2664 </wchar_t>

时间:2009-04-02 11:15:05

标签: string visual-c++ visual-c++-2008 c2664

您好,在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;'的右手操作数(或者没有可接受的转换)

我做错了什么?

任何人都可以帮助我了解背后发生的事情吗? 感谢

3 个答案:

答案 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>