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í.
"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
:-) ¡Gracias! Fijo. – templatetypedef