2012-03-04 166 views
5

con C++, trato de"más de una instancia de función sobrecargada 'std :: pow' coincide con la lista de argumentos"

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

Doy el código con el #include y espacio de nombres de la información para la clase (. h) en su diminuta se define

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

using namespace std; 

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

utilizo diminuto en alguna implementación de la función en el archivo .cpp, y Tiny da error

IntelliSense: más de una instancia de la función sobrecargada "std :: pow" coincide con la lista de argumentos

¿Qué es la sintaxis correcta?

+4

título de la cuestión es muy engañoso, ya que no tiene absolutamente nada que ver con el preprocesador. ¿Por qué estás usando pow, en lugar de solo escribir 1e-10? – PlasmaHH

+0

prueba std :: pow (10.0, 10.0) para seleccionar explícitamente las sobrecargas flotantes/dobles. –

+6

+1 para PlasmaHH: Usar 'const double tiny = 1E-10;' es, de lejos, la mejor solución y la mayoría de C++. –

Respuesta

10

Editar: Estoy de acuerdo con los comentaristas que opinan que el uso de std :: pow() en lugar de una constante literal es innecesaria - así que para este problema en particular, ir con la constante 1.0E-10; mi explicación del error real que estaba recibiendo y la forma de resolverlo sigue en pie.

Esto no tiene nada que ver con su #define. std::pow() es una función sobrecargada, y ninguna de sus sobrecargas toma (int, int) como argumentos. Debe proporcionar argumentos con tipos que seleccionen sin ambigüedad una sobrecarga. Dependiendo del tipo de valor de retorno que desea, es probable que desee para seleccionar una de estas sobrecargas:

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

que se puede invocar la siguiente manera:

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

respectivamente.

1

Intente usar std::pow(10.0,-10.0) en su lugar: std::pow tiene múltiples overloads que coinciden con su lista de argumentos; especificando 10.0,-10.0 fuerza el uso de la sobrecarga específica:

double pow(double base, double exponent); 

Tenga en cuenta que este #define puede ser subóptima en función del uso de TINY: cada vez que lo utilice en su código, se hará una llamada a std::pow para calcular el mismo valor. Un mejor enfoque sería usar una variable estática, configurarla una vez y usarla desde ese momento.

2

creo que la mejor manera es definir una variable constante y inicializarlo sin utilizar la función pow, como este

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