c++ 无法编译具有函数的无符号重载和有符号重载的代码[duplicate]

oalqel3c  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(211)
    • 此问题在此处已有答案**:

the rules in function overloading(2个答案)
16小时前关门了。
我试图写一个重载函数来接受有符号和无符号整数。
下面是我的代码:

#include <iostream>

void fun(const long long a)
{
    std::cout << "Signed: " << a << std::endl;
}

void fun(const unsigned long long a)
{
    std::cout << "unsigned: " << a << std::endl;
}

int main()
{
    unsigned int v = 10;
    fun(v);
    return 0;
}

这会产生以下编译错误。

main.cpp:17:5: error: call to 'fun' is ambiguous
    fun(v);
    ^~~
main.cpp:4:6: note: candidate function
void fun(const long long a)
     ^
main.cpp:9:6: note: candidate function
void fun(const unsigned long long a)
     ^
1 error generated.

我假设它会工作得很好,因为unsigned int可以用unsigned long long类型表示。
有人能帮我理解这个错误吗?

enxuqcxy

enxuqcxy1#

一般来说,无符号整数可以隐式转换为更大的(无)符号整数,而不会丢失任何数据,并且在大多数实现中,(un)signed long long大于unsigned int
由于unsigned int可以隐式地转换为long longunsigned long long,编译器不知道你要调用哪个重载,因此出现了这个错误。因此,你必须显式地告诉它要使用哪个重载,例如:

fun(static_cast<unsigned long long>(v));

或者

static_cast<void (*)(const unsigned long long)>(fun)(v);

或者

void (*f)(const unsigned long long) = fun;
f(v);

相关问题