【问题标题】:"more than one instance of overloaded function "std::pow" matches the argument list"“多个重载函数实例“std::pow”匹配参数列表”
【发布时间】:2012-03-22 05:39:00
【问题描述】:

使用 C++,我尝试

#define TINY std::pow(10,-10)

我给出的代码带有 #include 和定义 TINY 的类 (.h) 的命名空间信息

#pragma once
#include "MMath.h"
#include <string>
#include <cmath>
#include <vector>

using namespace std;

#define TINY std::pow(10,-10)

我在.cpp文件的一些函数实现中使用了TINY,TINY报错

IntelliSense:多个重载函数“std::pow”实例与参数列表匹配

什么是正确的语法?

【问题讨论】:

  • 问题标题非常具有误导性,因为它与预处理器完全无关。为什么要使用 pow,而不是只写 1e-10 ?
  • 尝试 std::pow(10.0, 10.0) 显式选择 float/double 重载。
  • +1 for PlasmaHH:使用const double tiny = 1E-10; 是迄今为止最好和最 C++ 的解决方案。
  • 两者都工作正常,确实。谢谢。

标签: c++ namespaces constants c-preprocessor


【解决方案1】:

我认为最好的方法是定义一个常量变量并在不使用pow函数的情况下对其进行初始化,像这样

const double TINY = 1E-10; //1e-10 is 10 to the power of -10

【讨论】:

    【解决方案2】:

    编辑: 我同意评论者的说法,即不需要使用 std::pow() 代替文字常量 - 所以对于这个特殊问题,请使用 1.0E-10 常量;我对您遇到的实际错误以及解决方法的解释仍然有效。

    这与您的#define 无关。 std::pow() 是一个重载函数,它的所有重载都没有将 (int, int) 作为参数。您应该为参数提供明确选择重载的类型。根据您想要的返回值类型,您可能需要选择以下重载之一:

          float pow (       float base,       float exponent );
         double pow (      double base,         int exponent );
    long double pow ( long double base,         int exponent );
    

    您可以按如下方式调用:

    std::pow(10.0f, -10.0f)
    std::pow(10.0, -10)
    std::pow(10.0L, -10)
    

    分别。

    【讨论】:

      【解决方案3】:

      尝试改用std::pow(10.0,-10.0)std::pow 有多个overloads 匹配您的参数列表;指定10.0,-10.0 会强制使用特定的重载:

      double pow(double base, double exponent);
      

      请注意,根据TINY 的使用,这个#define 可能不是最优的:每次在代码中使用它时,都会调用std::pow 来计算相同的值。更好的方法是使用静态变量,设置一次,然后从那时起使用它。

      【讨论】:

        猜你喜欢
        • 2012-05-26
        • 2012-10-12
        • 2021-10-11
        • 1970-01-01
        • 2023-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多