4

我正在使用 aQByteArray来存储原始二进制数据。为了存储数据,我使用了QByteArrayappend 函数。

我喜欢使用无符号字符来表示字节,因为我认为255-1. 但是,当我尝试将零值字节附加到 aQByteArray时,如下所示:

command.append( (unsigned char) 0x00));

编译器抱怨call of overloaded append(unsigned char) is ambiguous. 据我了解,这是因为零可以解释为空指针,但为什么编译器不将 unsigned char 视为 char,而不是想知道它是否是 const char*?当然,如果编译器抱怨command.append(0)没有任何强制转换,我会理解。

4

2 回答 2

5

两种重载都需要类型转换——一个从unsigned charto char,另一个从unsigned charto const char *。编译器不会尝试判断哪个更好,它只是告诉您使其明确。如果一个是完全匹配的,它将被使用:

command.append( (char) 0x00));
于 2012-08-28T18:27:43.237 回答
3

unsigned char并且char是两种不同但可转换的类型。unsigned char并且const char *也是两种不同的类型,在这种特定情况下也可以转换。这意味着您的重载函数都不是与参数完全匹配的,但在这两种情况下,参数都可以转换为参数类型。从语言的角度来看,这两个函数同样适合调用。因此模棱两可。

您似乎认为该unsigned char版本应该被视为“更好”的匹配。但是语言不同意你。

确实,在这种情况下,歧义源于(unsigned char) 0x00一个有效的空指针常量这一事实。您可以通过引入中间变量来解决该问题

unsigned char c = 0x0;
command.append(c);

c不符合空指针常量的条件,从而消除了歧义。虽然,正如@David Rodríguez - dribeas 在评论中指出的那样,您可以通过简单地将零转换为char而不是来消除歧义unsigned char

于 2012-08-28T18:31:44.070 回答