想象一下,你的代码库中有一个函数X()。它需要三个参数。原型看起来像这样:
在头文件中:
void X(string a, int b, string c);
在.cpp文件中:
void myclass::X(string a, int b, string c) {
...
}
假设您要添加到代码库中,并且特别需要传递第4个参数 到X只在一个地方。 3个参数调用都需要保持不变。您希望避免破坏对X的所有3参数版本的调用。
我已尝试使用建议here,但这不起作用。答案一仍然产生没有找到匹配功能的错误。尝试做出回答2个建议的答案会产生错误,我无法重载该功能。具体来说,我尝试这个,基于该链接中的答案2:
在头文件中:
void X(string a, int b, string c, string d);
void X(string a, int b, string c, string d="default_value");
非常感谢有关如何正确添加单个4参数调用而不破坏所有3参数调用的任何建议 - 谢谢!
答案 0 :(得分:3)
只需添加一个新原型,保留前一个原型:
string X(string a, int b, string c);
string X(string a, int b, string c, string d);
您无法为新参数指定默认值,因为这会导致歧义:编译器无法知道您要调用哪种方法。
或者您可以用新的定义替换旧定义,获取一个额外参数,并为其设置默认值。但在这种情况下,您必须删除以前的函数声明。
根据您的语法,我认为您正在使用
using namespace std;
在标题中。这是不好的做法。这样做会在包含此标头的任何位置使用std命名空间填充全局命名空间。您应该删除此指令,然后对您的类型进行限定:std::string
而不是string
答案 1 :(得分:1)
在头文件中,您需要有两个函数
void string X(string a, int b, string c);
void string X(string a, int b, string c, string d);
这样,使用三个参数调用X的所有代码段都不会中断,并且调用带有四个参数调用X的单个位置(即调用适当的重载函数)。
答案 2 :(得分:0)
您只需要头文件中的第二个定义。拥有它们都是造成重载错误的原因。
void string X(string a, int b, string c, string d="default_value");
表示当给出4个值时,使用提供的d,当只给出3时,将d设置为“default_value”。
答案 3 :(得分:0)
此示例使用最大警告级别编译:
#include <iostream>
#include <string>
void foo(std::string , int , std::string , std::string d="default_value")
{
std::cout<<"d="<<d<<std::endl;
}
int main() {
foo("param1",55,"param2");
}
foo函数的最后一个参数有一个默认值。