无法编译含signed与unsigned函数重载的代码,求错误原因
编译错误原因解析
你的代码出现调用歧义的核心原因是:unsigned int类型的变量转换到long long和unsigned long long的隐式转换优先级相同,编译器无法确定选择哪个重载函数。
具体拆解:
- 你的两个重载函数分别接收
long long(有符号64位整数)和unsigned long long(无符号64位整数)。 - 当传入
unsigned int类型的v时,编译器需要进行隐式转换才能匹配其中一个函数:- 匹配
fun(const long long):需要把unsigned int转换为有符号的long long,这是无符号到有符号的整数转换。 - 匹配
fun(const unsigned long long):需要把unsigned int转换为更大的无符号整数unsigned long long,这是无符号到无符号的整数扩展转换。
- 匹配
- 根据C++的重载决议规则,这两种转换都属于标准转换序列,且它们的转换等级是相同的——没有哪一种转换比另一种更“优先”。编译器无法判定你期望调用哪个版本,因此抛出歧义错误。
解决方法
你可以通过以下方式消除歧义:
- 显式类型转换:调用时明确指定转换类型,比如:
fun(static_cast<unsigned long long>(v)); // 明确调用无符号版本 // 或 fun(static_cast<long long>(v)); // 明确调用有符号版本 - 增加精确匹配的重载:添加一个接收
unsigned int参数的函数,这样编译器会优先选择精确匹配的版本,无需隐式转换:void fun(const unsigned int a) { std::cout << "unsigned int: " << a << std::endl; }
内容的提问来源于stack exchange,提问作者Vijaymahantesh Sattigeri
相关产品推荐
相关产品推荐

