2009-04-02 4 views
0

Привет при компиляции этого кода в Visual Studio 2008 я получаю следующую ошибкуошибка C2664 при использовании basic_string <wchar_t> ABC ("привет") в VC++ 9.0

#include<iostream> 
#include<string> 
using namespace std; 
void main() 
{ 
    basic_string<wchar_t> abc("hello world"); 
    cout<<abc; 
    return; 
} 

ошибка C2664: «зЬй :: 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>' (или нет приемлемого преобразования)

Что я такое делаю неправильно?

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

ответ

3

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

Так просто перейти к

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

спасибо большое .. я решил мою проблему! –

+0

Это не касается обеих ошибок. – dirkgently

3

Try:

ошибка C2664:

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

ошибка C2679:

cout << abc.c_str(); 

(Поскольку компилятор C annot/не будет обеспечивать подходящую перегрузку для каждого созданного пользователем типа. Однако, так как это тоже стандартный тип т.е. 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 вместо того, чтобы изобретать колесо.

+0

спасибо lot..it решаемые моя проблема! –

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>