在 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*/);
我在这里定义了这个函数;
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*/);