【问题标题】:More than once instance of overloaded function when using default arguments in C++在 C++ 中使用默认参数时不止一次的重载函数实例
【发布时间】:2015-01-20 17:03:04
【问题描述】:

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

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 方法中仅使用一个参数调用该方法,则会出现上述语法错误。我不知道为什么会这样,这让我很生气。

【问题讨论】:

  • 你能发布“以上语法错误”吗?还有,函数定义写在哪里?
  • “语法错误”,即。标题中的那个。
  • @Maurdekye 您的标题没有(也不应该)描述确切的语法错误。

标签: c++ function arguments instance


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    从定义中删除默认值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) 选项。

    【讨论】:

    • 是的。仍然得到错误。我将其从定义中删除,并保留在原型中。
    • 很可能在他的代码中 round() 是在全局命名空间中声明的,这导致与标准 round() 函数发生冲突
    • (b) 不起作用(至少不可移植),因为无论您是否愿意,某些实现都将 C 库转储到全局命名空间中。不幸的是,标准允许他们这样做。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多