C++ C++;用于添加默认参数的特定语法

C++ C++;用于添加默认参数的特定语法,c++,function,arguments,default-value,C++,Function,Arguments,Default Value,假设您的代码库中有一个函数X()。这需要三个论点。原型如下所示: 在头文件中: void X(string a, int b, string c); void X(string a, int b, string c, string d); void X(string a, int b, string c, string d="default_value"); 在.cpp文件中: void myclass::X(string a, int b, string c) { ... } 假

假设您的代码库中有一个函数X()。这需要三个论点。原型如下所示:

在头文件中:

void X(string a, int b, string c);
void X(string a, int b, string c, string d);    
void X(string a, int b, string c, string d="default_value");
在.cpp文件中:

void myclass::X(string a, int b, string c) {
...
}
假设您正在添加代码库,并且特别需要传递第四个参数 只在一个点上移动到X。3参数调用都需要保持不变。您希望避免破坏对X的所有3参数版本的调用

我试过使用这个建议,但不起作用。答案1仍然生成未找到匹配函数的错误。尝试执行回答2建议会产生错误,我无法使函数过载。具体来说,我根据该链接中的答案2来尝试:

在头文件中:

void X(string a, int b, string c);
void X(string a, int b, string c, string d);    
void X(string a, int b, string c, string d="default_value");

对于如何在不中断所有3参数调用的情况下正确添加单个4参数调用的任何建议,我们将不胜感激-谢谢

只需添加一个新的原型,保持前一个原型不变:

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
只需添加一个新原型,保持前一个原型不变:

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
,您需要有两个函数

void string X(string a, int b, string c);
void string X(string a, int b, string c, string d);

这样,使用三个参数调用X的所有代码段都不会中断,并且将调用使用四个参数调用X的单个位置(即,调用相应的重载函数)。

在头文件中,您需要有两个函数

void string X(string a, int b, string c);
void string X(string a, int b, string c, string d);

这样,使用三个参数调用X的所有代码段都不会中断,并且将调用使用四个参数调用X的单个位置(即调用相应的重载函数)。

您只需要头文件中的第二个定义。这两种情况都存在是造成过载错误的原因

void string X(string a, int b, string c, string d="default_value");

意味着,当给出4个值时,使用提供的d,当只给出3个值时,将d设置为“默认值”。

您只需要头文件中的第二个定义。这两种情况都存在是造成过载错误的原因

void string X(string a, int b, string c, string d="default_value");

意味着,当给出4个值时,使用提供的d,当仅给出3个值时,将d设置为“默认值”。

此示例以最大警告级别编译:

#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");
}
#包括
#包括
void foo(std::string,int,std::string,std::string d=“默认值”)
{

std::cout此示例以最大警告级别编译:

#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");
}
#包括
#包括
void foo(std::string,int,std::string,std::string d=“默认值”)
{

std::cout
void string X
?这是什么意思?@AusCBloke+1让我们看看其他答案什么时候会被编辑;-)剪切粘贴错误-我是法律盲。修复。
void string X
?这是什么意思?@AusCBloke+1让我们看看其他答案什么时候会被编辑;-)剪切粘贴错误-我是法律盲。修复。呵呵当使用3个参数调用时,编译器会选择使用哪个函数吗?很抱歉,当我输入错误的问题中复制粘贴时。当使用3个参数调用时,编译器会如何选择使用哪个函数?很抱歉,当使用输入错误的问题中复制粘贴时。实际上,我创建了一个任意函数定义,并且是随机的选择它是为了获取字符串类型的参数。实际上,这是一个具有嵌套名称空间的复杂代码库。但我将来确实会小心污染/使用名称空间。谢谢!实际上,我创建了一个任意函数定义并随机选择它来获取字符串类型的参数。实际上,这是一个复杂的代码库th嵌套的名称空间。但我将来确实会小心污染/使用名称空间。谢谢!