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

时间:2016-01-04 08:58:17

标签: c++

#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(i,k)中调用fun(a,b,c)时出现编译时错误。我明白为什么我得到这个编译错误,但我找不到替代方案。请提出替代方案。

4 个答案:

答案 0 :(得分:0)

致电fun(i,k)不明确,因为这可能意味着您想要int fun(int i, float k)int fun(int i, float k, char c)c='g'

您可以更改其中一个功能名称来解决问题。

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

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;
}

答案 1 :(得分:0)

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

let text = "Add \"ABC\""
let range = text.rangeOfString("(?<=\")[^\"]+", options: .RegularExpressionSearch, range: nil, locale: nil)
if let nonNilRange = range {
    print(text.substringWithRange(nonNilRange))
}

答案 2 :(得分:0)

您的设计表明B将通过指针/参考A使用,但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; }

答案 3 :(得分:0)

以下可能会有所帮助:

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;
    }
};

所以带有0,1,2个参数的B::foo使用覆盖方法,使用3个参数,它使用重载。

Live Demo

,例如

B b;
A& a = b;

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