Ошибка преобразования типов в C++

У меня есть программа, в которой мне нужно использовать Format(); функция для объединения строкового литерала и int в переменную CString. Я пробовал несколько разных способов сделать это, код для них здесь:

// declare variables used
CString _CString;
int _int;

// try to use format function with string literal
_CString.Format("text",_int); 

// try to use format function with C-Style cast
_CString.Format((wchar_t)"text",_int);

// try to use format function with static_cast 
_CString.Format(static_cast<wchar_t>("text"),_int);

Первый возвращает ошибку C2664: 'void ATL::CStringT::Format(const wchar_t *,...)': невозможно преобразовать параметр 1 из 'const char [33]' в 'const wchar_t *'

Во втором случае ошибки нет, но текст отображается китайскими иероглифами.

Третий возвращает ошибку C2440: «static_cast»: невозможно преобразовать «const char [33]» в «wchar_t».

Есть идеи по преобразованию CStrings в wchar_t *s?
Спасибо.


person Nate Koppenhaver    schedule 06.01.2011    source источник
comment
Это СУПЕР придирчиво, но с технической точки зрения вы не должны называть переменные именами, в именах которых есть символ подчеркивания, за которым следует заглавная буква. Эти имена зарезервированы реализацией для любого использования, которое они считают нужным (включая злые макросы произвольности). Просто подумал, что упомяну это как FYI.   -  person templatetypedef    schedule 06.01.2011


Ответы (3)


Проблема в том, что вы выполняете сборку UNICODE (что нормально), поэтому

_CString.Format(); 

функция, я ожидаю, что первый параметр будет широкой строкой символов. Вам нужно использовать синтаксис L"" для формирования строкового литерала с широкими символами:

_CString.Format(L"text",_int); 

Конечно, вам понадобится спецификатор, чтобы форматировать переменную int в CString:

_CString.Format(L"text: %d",_int); 

Если вы включаете заголовок tchar.h, вы можете использовать макросы Microsoft, чтобы сделать строковый литерал широким символом или обычным старым символом (иначе известный как ANSI) в зависимости от того, создаете ли вы UNICODE или нет:

_CString.Format(_T("text: %d)",_int); 

но я бы сказал, что если вы не планируете поддерживать устаревшие вещи, для которых потребуется поддержка ANSI, я, вероятно, не стал бы беспокоиться о tchar.h материалах.

person Michael Burr    schedule 06.01.2011

Ну, не совсем понятно, какой тип строки вы хотите настроить, но вот что я буду делать:

_CString.Format(_T("%d"), _int);

Попытка типа привести многобайтовую строку к строке Unicode может скомпилироваться, но вызывает проблемы, поскольку это все еще многобайтовая строка. Вам нужно будет преобразовать всю строку, а не просто привести ее к типу, если вы этого хотите.

person Jonathan Wood    schedule 06.01.2011

Попробуйте функцию mbstowcs. http://msdn.microsoft.com/en-us/library/ms235631(v=vs.80).aspx

person Brennan Vincent    schedule 06.01.2011