在 C++ 中使用默认参数时重载函数的实例不止一次

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

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

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

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

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

但是,如果我尝试仅使用一个参数从 main 方法中调用该方法,则会出现上述语法错误。我不知道为什么会这样,这让我发疯。

从定义中删除默认值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(...) 的调用不明确,当只有一个参数传递给这个函数时,编译器无法猜测你是在调用你的函数还是 std 实现 round。为避免这种模棱两可的调用,(a) 将您的函数放入您自己的命名空间中 (b) 为您的函数考虑另一个名称。我会选择 (b) 选项。

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

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

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

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

默认值只能指定一次。当你有一个带有默认参数的函数的单独原型和定义时,你只需要将默认值放在原型上,而不是定义上。从定义中取出“=0”(但将其保留在原型中),它应该可以工作。

C++ 不支持默认参数的重定义。您应该像这样从函数的定义中删除默认参数的定义:

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