2011-06-03 14 views

Respuesta

31

string::size() devuelve size_t, y sqrt no lo acepta en ninguna de sus versiones. Entonces el compilador tiene que lanzar y no puede elegir qué, todos están bien. Usted tiene que poner conversión explícita:

maxy = (int)sqrt((double)aux.size()); 
11

El problema es que en C++, hay tres funciones con nombre sqrt - una toma en un float, uno teniendo un double, y uno teniendo un long double. Cuando intenta llamar a

sqrt(aux.size()); 

El compilador intenta determinar a cuál de estas funciones desea llamar. Dado que aux.size() devuelve string::size_type, que no es ni float, double, ni long double, trata de ver si string::size_type es implícitamente convertible a cualquiera de estos tres. Pero dado que string::size_type es convertible a estos tres tipos, el compilador marca la llamada como ambigua, ya que no está claro cuál de las conversiones desea hacer.

Para solucionar esto, puede convertir explícitamente aux.size() al tipo que desee. Por ejemplo:

sqrt(double(aux.size())); 

o

sqrt(float(aux.size())); 

Esto hace que la llamada coincide de forma inequívoca una de las dos funciones. Dependiendo de la precisión que desee, puede elegir cualquiera de las tres sobrecargas. Dado que solo está volviendo a un int, probablemente esté bien enviar a float aquí.

+1

"Un paréntesis izquierdo sin igual crea una tensión no resuelta que permanecerá contigo todo el día" http://xkcd.com/859/ Es por eso que prefiero los moldes de estilo C para casos como este - producen menos niveles de anidamiento . – AnT

+0

:-) ¡Gracias! Fijo. – templatetypedef

0

intenta transmitir la aux.size() para uno de esos tipos, por lo que no habrá ambigua ...

1

aux.size() devuelve un std::size_t, pero sqrt() no tiene una versión sobrecargada que toma un argumento std::size_t .

El compilador informa que sqrt tiene 3 sobrecargas: que tienen float, double y long double argumentos. std::size_t podría convertirse a cualquiera de esos, por lo que existe una ambigüedad ya que el compilador no sabe si convertir std::size_t a float o double o long double.

Cuestiones relacionadas