无法使用“const char [X]”类型的左值初始化“const signed char *”类型的成员子对象
Posted
技术标签:
【中文标题】无法使用“const char [X]”类型的左值初始化“const signed char *”类型的成员子对象【英文标题】:Cannot initialize a member subobject of type 'const signed char *' with an lvalue of type 'const char [X]' 【发布时间】:2017-10-11 10:13:39 【问题描述】:我有以下代码:
typedef signed char Char;
static const struct MyStruct
const Char* str;
// Other fields
myList[] =
"none", /* Other fields */,
"main", /* Other fields */,
但我有编译错误:
无法使用“const char [X]”类型的左值初始化“const Char *”类型的成员子对象(又名“const signed char *”)
X 是字符串长度
当我将Char
替换为char
时没问题,但是如何使用signed char
?
【问题讨论】:
【参考方案1】:"none"
,例如是const char[5]
类型。在某些情况下,这可能衰减为const char*
。
无论在您的平台上char
是signed
还是unsigned
,char
、signed char
和unsigned char
都是始终不同的类型。
C++ 不允许将const char[N]
类型直接衰减为const char*
以外的任何类型(或指向const char*
的typedef
的指针),因此在您的情况下,需要发出诊断。
在 C++ 中,您有很多其他选择:std::string
是您的明显选择。
要检查您拥有的char
的类型,请使用
std::numeric_limits<char>::is_signed
来自<limits>
。
【讨论】:
感谢您的快速回答。我怎么知道 char 是有符号还是无符号? @A.Pissicat:最后搞砸了。【参考方案2】:但是我怎样才能使用有符号字符呢?
通过使用signed char
的数组而不是字符串文字:
signed char none[] = 'n','o','n','e','\0';
...
myList[] =
none, /* Other fields */,
...
请注意,char
(字符文字的类型)可能是无符号的,如果 signed char
无法表示该值,则结果值将由实现定义。
【讨论】:
以上是关于无法使用“const char [X]”类型的左值初始化“const signed char *”类型的成员子对象的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 double 类型的左值初始化“id _NonNull”类型的参数
错误:无法使用“const char [34]”类型的左值初始化“const char”类型的返回对象