错误:重载函数的多个实例与参数列表匹配

Error: more than one instance of overloaded function matches argument list

本文关键字:参数 列表 实例 重载 函数 错误      更新时间:2023-10-16
#include<stdio.h>
class A
{
public:
    virtual int fun( int a=0, float f = 5.4)=0;
};
class B: public A
{
public:
    int fun(int i = 0, float k= 5.4)
    {
        return 0;
    }
    int fun(int i= 8, float k = 4.5, char c = 'g')
    {
        if(c != 'g')
            return fun(i,k);
        else
            return -1;
    }
};
int main()
{
    //fun();
    return 0;
}

这个程序是我的项目代码的副本。我在fun(a,b,c)中调用fun(i,k)时出现编译时错误。我明白为什么我会收到这个编译错误,但我找不到替代方案。请提出替代方案。

调用fun(i,k)是不明确的,因为它可能意味着您想使用c='g'调用int fun(int i, float k)int fun(int i, float k, char c)

您可以更改其中一个函数名称来解决您的问题。

另一种解决方案是将它们合并到一个函数中

int fun(int i= 8, float k = 4.5, char c = 'g')
{
    if(c != 'g')
        //code of int fun(int i = 0, float k= 5.4)
    else
        return -1;
}

切换参数,并删除一个默认值,否则您必须重命名它们。

int fun(int i = 0, float k= 5.4)
{
    return 0;
}
int fun(char c, int i= 8, float k = 4.5)
{
    if(c != 'g')
        return fun(i,k);
    else
        return -1;
}

您的设计建议通过指向A的指针/引用使用 B,但 B 中的额外重载在 A 中不可见。您不是在扩展基接口,而是在扩展特定的派生类接口。

如果您仍然想这样做:

如果要在未提供c的情况下调用第一个重载,则不需要任何重载,因为可以直接调用fun(i,k)

由于具有默认值的参数需要位于末尾,因此您希望首先使用 char 参数

int fun(char c, int i= 8, float k = 4.5) { return c != 'g' ? fun(i,k) : -1; }

或者,您可以使用没有默认值的重载:

int fun(int i, float k, char c) { return c != 'g' ? fun(i,k) : -1; }

以下内容可能会有所帮助:

class A
{
public:
    virtual ~A() = default;
    virtual int fun(int = 0, float = 5.4f) = 0;
};
class B: public A
{
public:
    int fun(int i = 8, float k = 4.5f) override // You may change default value here
                                                // but not recommended
    {
        return 0;
    }
    int fun(int i, float k, char c) // it is not an override
    {
        if(c != 'g')
            return fun(i, k);
        else
            return -1;
    }
};

因此,B::foo具有 0、1、2 个参数,则使用 override 方法,对于 3 个参数,它使用重载。

现场演示

对于类似

B b;
A& a = b;
a.fun(); // fun(0, 5.4)
b.fun(); // fun(8, 4.5) // That part may surprise user