无法从字符构造CString

Cannot construct CString from a char

本文关键字:CString 字符      更新时间:2023-10-16

在VS2008中,我尝试从一个字符构造一个CString,如下所示:

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

但是会得到以下编译错误:

错误C2440:":无法从"int"转换为"CString">

我相信TCHAR和int在C++中是可交换的,那么为什么它拒绝接受TCHAR类型参数来构造CString呢?

该行的目的是构造一个只有一个字符_T('F'(的CString。不要得到"A5"。

我试图理解编译器是如何处理代码的,如下所示:

  1. 它将首先将_T('A'(提升为整数。

  2. 它将把_T('A'(的整数值加5。

  3. 它将获得一个新的整数,但找不到将其转换回TCHAR的方法,TCHAR可以用作CString构造函数的输入参数。

接受charwchar_tCstringT构造函数是explicit。请参阅文档。

C++中的explicit说明符表示编译器不允许对参数进行隐式转换。另请参见显式说明符。

因此,编译器不能(不允许(将int值隐式转换为charwchar_t

(注意,这取决于正在设置的标志_ATL_CSTRING_EXPLICIT_CONSTRUCTORS。如果没有设置标志,构造函数就不是显式的,但选择哪个构造函数就不明确了。(

因此,您需要将参数显式转换为charwchar_t,具体取决于您想要的内容:

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

或:

CStringW str = CStringW(static_cast<wchar_t>(L'A' + 5));

CString不会隐式地将int转换为CString。然而,你可以尝试这样

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