在C++中使用默认参数时,重载函数的多个实例

More than once instance of overloaded function when using default arguments in C++

本文关键字:函数 重载 实例 C++ 参数 默认      更新时间:2023-10-16

我在这里定义了这个函数;

static double round(double x, int d = 0) {
    return (x * pow(10.0, d) - fmod(x * pow(10.0, d) - 0.5, 1.0) + 0.5) / pow(10.0, d);
}

我在主方法上方定义了这个原型;

static double round(double x, int d = 0);

但是,如果我尝试仅使用一个参数从 main 方法中调用该方法,它会给我上述语法错误。我不知道为什么会发生这种情况,这让我发疯。

如果包含任何标准标头,则它可能与同名的 C 库函数冲突。

不幸的是,C++库实现被允许将它们转储到全局命名空间中以及namespace std,因此很难避免此类冲突。

唯一的可移植解决方案是更改函数,使其与 C 库函数具有不同的名称或不同的(非可选)参数,或者位于不同的命名空间中。

(此外,正如其他答案所指出的,您只能指定一次默认参数。您应该将它们从定义中删除,只保留在声明中。

从定义中删除默认值d = 0,它已经被声明,即

static double round(double x, int d = 0);
// .. 
static double round(double x, int d) {
    return (x * pow(10.0, d) - fmod(x * pow(10.0, d) - 0.5, 1.0) + 0.5) / pow(10.0, d);
}

编辑:

您的错误是由于函数调用不明确造成的,round(...)当只有一个参数传递给此函数时,编译器无法猜测您是在调用函数还是roundstd实现。为了避免这种模棱两可的调用,(a) 将函数放入您自己的命名空间中 (b) 为函数考虑另一个名称。我会选择(b)选项。

默认值只能指定一次。当您为具有默认参数的函数提供单独的原型和定义时,只需将默认值放在原型上,而不是定义上。从定义中删除"=0"(但将其保留在原型中),它应该可以工作。

C++不支持

重新定义默认参数。您应该从函数的定义中删除默认参数的定义,如下所示:

static double round(double x, int d/* = 0*/);