将"unsigned char"传递给需要 char 或 const char* 的重载函数会导致歧义
Passing an "unsigned char" to an overloaded function expecting either char or const char* results in ambiguity
我使用QByteArray
来存储原始二进制数据。为了存储数据,我使用QByteArray
的append函数。
我喜欢使用无符号字符来表示字节,因为我认为255
比-1
更容易解释。然而,当我尝试将零值字节附加到QByteArray
时,如下所示:
command.append( (unsigned char) 0x00));
编译器向CCD_ 6抱怨。据我所知,这是因为零可以被解释为空指针,但为什么编译器不将无符号字符视为字符,而不是怀疑它是否是const字符*?当然,如果编译器抱怨command.append(0)
没有任何强制转换,我会理解的。
两个重载都需要类型转换——一个从unsigned char
转换为char
,另一个从unsigned char
转换为const char *
。编译器并不试图判断哪一个更好,它只是告诉你让它显式。如果其中一个是完全匹配的,它将被使用:
command.append( (char) 0x00));
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
来消除歧义。
- 使用 bool 和 const char 重载的 C++ 函数会在没有警告的情况下产生歧义 (MSVC2012)
- 在C++中,为什么要重载"const char 数组"上的函数和包装"const char
- 重载运算符'<<'的使用不明确(操作数类型'ostream'(也称为"basic_ostream<char>")和"Person")
- 重载的 'func(char*&)' 的调用是不明确的
- 运算符重载时出错(错误:"运算符<<不匹配(操作数类型为"std::basic_ostream<char>"和"const char [2]")
- 使用函数重载在 c++ 中用整数调用 char 等效函数
- 重载运算符'>>'的使用不明确(操作数类型'istream'(又名"basic_istream<char>")和"MyIncreEx")
- C++ 中 int 和 char 的重载运算符
- 对重载'swap(char&, char&)'的调用不明确
- C++ 编译错误:重载的"<function_name>(char*&)"调用不明确
- 为什么<char>我的重载流运算符上出现 std::basic_string 段错误?
- 将"unsigned char"传递给需要 char 或 const char* 的重载函数会导致歧义
- 在编译模板方面,char、有符号char或无符号char参数类型的函数重载
- Char赋值的重载运算符[]-C++
- 重载运算符<<:无法将左值绑定到"std::basic_ostream<char>&&"
- 是否可以让C++方法接受const char*和const wchar_t*作为参数而不重载该方法
- 可以将运算符*重载为int和char*的倍数
- c++ const char*重载混淆
- 仅对char*和字符串重载函数
- 是否有可能合法地重载字符串字面值和const char*