错误:重载函数的多个实例与参数列表匹配
Error: more than one instance of overloaded function matches argument list
#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
相关文章:
- 概念中的cv限定符需要表达式参数列表
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- 错误 没有与参数列表匹配的重载函数"getline"实例
- std::vector 没有重载函数的实例与参数列表匹配
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 构造函数/函数声明参数列表中的统一初始化
- 模板化检查是否存在带有参数列表的类成员函数?
- 如何将类成员方法的参数列表自动填充写入可变参数?
- 带有整数的变量参数列表
- 转发变量参数列表以模拟 std::thread
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- C++-将具有引用的长参数列表重构为结构
- 缺少别名模板C++参数列表
- C++如果两个模板函数都与参数列表匹配,将调用哪个模板
- "extern"声明以及带有和不带参数列表的类模板实例的后续定义
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 没有函数模板的实例与我不知道为什么的参数列表匹配
- 我可以使用宏自动构建参数列表吗?
- 类成员函数参数列表是否可以依赖于模板参数?