ошибка c2664 при использовании basic_string <wchar_t> abc ("hello") в vc ++ 9.0 - PullRequest
0 голосов
/ 02 апреля 2009

Привет после компиляции этого кода в 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] 'to' std :: basic_string <_Elem, _Traits, _Ax> :: _ Has_debug_it '

ошибка C2679: двоичный файл «<<»: не найден оператор, который принимает правый операнд типа «std :: basic_string <_Elem, _Traits, _Ax>» (или нет приемлемого преобразования)

что я делаю не так?

Может ли кто-нибудь помочь мне понять, что происходит позади? Спасибо

Ответы [ 3 ]

3 голосов
/ 02 апреля 2009

wchar_t указывает типы широких символов. По умолчанию указатель const char на буквальную строку не является широким, но вы можете указать компилятору обрабатывать его как массив широких символов, добавив префикс «L».

Так что просто измените на

basic_string<wchar_t> abc(L"hello world");
3 голосов
/ 02 апреля 2009

Попробуйте:

ошибка C2664:

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

ошибка C2679:

cout << abc.c_str();

(Поскольку компилятор не может / не будет обеспечивать подходящую перегрузку для каждого типа, созданного пользователем. Однако, поскольку это также стандартный тип, например wstring, я посмотрел соответствующие заголовки и не нашел подходящих operator<<, которые принимают либо string, либо wstring.)

и используйте int main, поэтому у вас есть:

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

Тем не менее, вам действительно следует использовать std::wstring вместо того, чтобы заново изобретать колесо.

2 голосов
/ 03 апреля 2009

Проблема в том, что вы смешиваете широкие и (узкие?) Типы символов.

Для вашего 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>
...