Ошибка преобразования типов в C ++ - PullRequest
0 голосов
/ 06 января 2011

У меня есть программа, в которой мне нужно использовать 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?
Спасибо

Ответы [ 3 ]

3 голосов
/ 06 января 2011

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

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

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

2 голосов
/ 06 января 2011

Проблема в том, что вы выполняете сборку 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.

0 голосов
/ 06 января 2011

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

...