传递" unsigned char"期望char或const char *的重载函数导致歧义

时间:2012-08-28 18:16:51

标签: c++ qt

我正在使用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)没有任何演员。

2 个答案:

答案 0 :(得分:5)

两个重载都需要进行类型转换 - 一个从unsigned charchar,另一个从unsigned charconst char *。编译器不会试图判断哪一个更好,它只是告诉你使它明确。如果一个完全匹配,则使用它:

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

答案 1 :(得分:3)

unsigned charchar是两种不同但可转换的类型。 unsigned charconst char *也是两种不同的类型,在这种特定情况下也可以转换。这意味着您的重载函数都不是参数的完全匹配,但在这两种情况下,参数都可以转换为参数类型。从语言的角度来看,这两个功能同样适合呼叫。因此含糊不清。

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

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

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

c不符合空指针常量,这消除了歧义。虽然,正如@DavidRodríguez - 在评论中提到的那样,你可以通过简单地将零点转换为char而不是unsigned char来消除歧义。