无法从 char 构造 CString
Posted
技术标签:
【中文标题】无法从 char 构造 CString【英文标题】:Cannot construct CString from a char 【发布时间】:2019-10-31 09:26:14 【问题描述】:在VS2008中,我尝试从一个char构造一个CString,如下:
CString str = CString(_T('A') + 5);
但是会得到如下编译错误:
错误 C2440: '' : 无法从 'int' 转换为 'CString'
我相信 TCHAR 和 int 在 C++ 中是可交换的,为什么它拒绝接受 TCHAR 类型参数来构造 CString?
该行的目的是构造一个只有一个字符_T('F') 的CString。不要拿“A5”。
我尝试了解编译器如何处理代码,如下:
它将首先将 _T('A') 提升为整数。
它将_T('A')的整数值加5。
它会得到一个新的整数,但找不到将它转换回TCHAR的方法,它可以用作CString构造函数的输入参数。
【问题讨论】:
停止使用 tchar。在这里查看我的答案:***.com/a/50572941/104458 我不确定你想做什么,但如果你想得到A5
,那么str.Format(L"%c%d", 'A', 5);
就可以了。
@MaxVollmer,CString 有一个可以从 TCHAR 构造的构造函数
@Blaze,我正在尝试用一个字符 _T('F') 构造一个 CString。
那么你可能想要CStringA((char)('A' + 5))
或CStringW((wchar_t)(L'A' + 5))
【参考方案1】:
接受char
或wchar_t
的CstringT
构造函数是explicit
。请参阅docs。
C++ 中的explicit
说明符意味着不允许编译器对参数进行隐式转换。另见explicit specifier。
因此编译器不能(不允许)将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));
【讨论】:
【参考方案2】:CString 不会将 int 隐式转换为 CString。不过你可以这样尝试
CString str;
char c = 'A';
int i = 5;
str.Format(L"%c%d",c, i); // unicode assumed
【讨论】:
以上是关于无法从 char 构造 CString的主要内容,如果未能解决你的问题,请参考以下文章
无法将 const char 转换为构造字符串的字符串 [重复]
从char *到int [] / int *的C ++构造函数
您可以从`volatile const char *`构造一个字符串吗? (不使用`const_cast`)