我正在使用QByteArray
来存储原始二进制数据。为了存储数据,我使用QByteArray
的附加函数。
我喜欢使用无符号字符来表示字节,因为我认为255
比-1
更容易解释。但是,当我尝试将零值字节附加到QByteArray
时,如下所示:
command.append( (unsigned char) 0x00));
编译器抱怨call of overloaded append(unsigned char) is ambiguous
。据我所知,这是因为零可以被解释为空指针,但为什么编译器不将unsigned char视为char,而不是想知道它是否是const char * ?当然,我会理解编译器是否抱怨command.append(0)
没有任何演员。
答案 0 :(得分:5)
两个重载都需要进行类型转换 - 一个从unsigned char
到char
,另一个从unsigned char
到const char *
。编译器不会试图判断哪一个更好,它只是告诉你使它明确。如果一个完全匹配,则使用它:
command.append( (char) 0x00));
答案 1 :(得分:3)
unsigned char
和char
是两种不同但可转换的类型。 unsigned char
和const char *
也是两种不同的类型,在这种特定情况下也可以转换。这意味着您的重载函数都不是参数的完全匹配,但在这两种情况下,参数都可以转换为参数类型。从语言的角度来看,这两个功能同样适合呼叫。因此含糊不清。
您似乎相信unsigned char
版本应该被视为“更好”的匹配。但是语言不同意你的看法。
确实,在这种情况下,歧义源于(unsigned char) 0x00
是有效的空指针常量的事实。您可以通过引入中间变量来解决问题
unsigned char c = 0x0;
command.append(c);
c
不符合空指针常量,这消除了歧义。虽然,正如@DavidRodríguez - 在评论中提到的那样,你可以通过简单地将零点转换为char
而不是unsigned char
来消除歧义。