在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);
}
我在主方法上方定义了这个原型;
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(...)
当只有一个参数传递给此函数时,编译器无法猜测您是在调用函数还是round
的std
实现。为了避免这种模棱两可的调用,(a) 将函数放入您自己的命名空间中 (b) 为函数考虑另一个名称。我会选择(b)选项。
默认值只能指定一次。当您为具有默认参数的函数提供单独的原型和定义时,只需将默认值放在原型上,而不是定义上。从定义中删除"=0"(但将其保留在原型中),它应该可以工作。
C++不支持
重新定义默认参数。您应该从函数的定义中删除默认参数的定义,如下所示:
static double round(double x, int d/* = 0*/);
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载