Невозможно построить CString из символа - PullRequest
0 голосов
/ 31 октября 2019

В VS2008 я пытаюсь построить CString из символа следующим образом:

CString str = CString(_T('A') + 5);

Но получит следующую ошибку компиляции:

Ошибка C2440: '': невозможно преобразоватьот 'int' до 'CString'

Я верю, что TCHAR и int взаимозаменяемы в C ++, так почему же он отказывается принять параметр типа TCHAR для создания CString?

Назначение строкисостоит в том, чтобы создать CString только с одним символом _T ('F'). Не получить "A5".

Я пытаюсь понять, как компилятор обрабатывает код, следующим образом:

  1. Сначала он будет переводить _T ('A') вцелое число.

  2. Это добавит целочисленное значение _T ('A') на 5.

  3. Получит новое целое число ине удается найти способ преобразовать его обратно в TCHAR, который можно использовать в качестве входного параметра для конструктора CString.

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Конструкторы CstringT, которые принимают char или wchar_t, explicit. См. docs .

Спецификатор explicit в C ++ означает, что компилятору не разрешено выполнять неявное преобразование параметра (ов). См. Также явный спецификатор .

Таким образом, компилятор не может (не может) неявно преобразовывать значение int в char или wchar_t.

(Обратите внимание, что это зависит от установленного флага _ATL_CSTRING_EXPLICIT_CONSTRUCTORS. Без установленного флага конструкторы не являются явными, но тогда не ясно, какой конструктор выбрать.)

Так что вам нужноявное приведение параметра к char или wchar_t, в зависимости от того, что вы хотите:

CStringA str = CStringA(static_cast<char>('A' + 5));

или:

CStringW str = CStringW(static_cast<wchar_t>(L'A' + 5));
1 голос
/ 31 октября 2019

CString не будет неявно преобразовывать int в CString. Однако вы можете попробовать вот так

CString str; 
char c = 'A';
int i = 5;
str.Format(L"%c%d",c, i);  // unicode assumed
...