“std::pow”有多个重载函数与参数列表匹配。

5

使用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”的参数列表匹配

请问正确的语法是什么?


4
这个问题的标题非常误导人,因为它与预处理器完全没有关系。你为什么使用pow而不是直接写1e-10? - PlasmaHH
尝试使用std::pow(10.0, 10.0)来明确选择float/double重载。 - Pasi Savolainen
6
对于 PlasmaHH 的回答,给予一个“+1”。使用“const double tiny = 1E-10;”是迄今为止最好的、最符合C++语言规范的解决方案。 - Kerrek SB
3个回答

10

编辑:我同意评论者的观点,对于这个特定的问题,在使用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)

分别地。


2

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

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

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

double pow(double base, double exponent);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接