【问题标题】:C++ compiler error: ambiguous call to overloaded functionC++ 编译器错误:对重载函数的模糊调用
【发布时间】:2011-06-03 22:06:12
【问题描述】:
string aux;
int maxy,auxx=0;

cin>>aux;

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

我得到:

1> error C2668: 'sqrt' : ambiguous call to overloaded function
1>        could be 'long double sqrt(long double)'
1>        or       'float sqrt(float)'
1>        or       'double sqrt(double)'

为什么?

【问题讨论】:

    标签: c++


    【解决方案1】:

    string::size() 返回size_t,而sqrt 在其任何版本中都不接受它。所以编译器必须强制转换,并且不能选择什么 - 它们都可以。您必须进行明确的演员表:

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

    【讨论】:

      【解决方案2】:

      问题在于,在 C++ 中,有三个名为 sqrt 的函数 - 一个接受 float,一个接受 double,一个接受 long double。当您尝试调用时

      sqrt(aux.size());
      

      编译器会尝试确定您要调用哪些函数。由于aux.size() 返回一个string::size_type,它既不是floatdouble 也不是long double,它会尝试查看string::size_type 是否可以隐式转换为这三个中的任何一个。但由于string::size_type 可以转换为所有这三种类型,编译器会将调用标记为不明确,因为不清楚您要进行哪种转换。

      要解决此问题,您可以将aux.size() 显式转换为您想要的类型。例如:

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

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

      这使得调用明确匹配两个函数之一。根据您想要的精度,您可以选择三个重载中的任何一个。由于您只是转换回int,因此在这里转换为float 可能没问题。

      【讨论】:

      • “一个无与伦比的左括号会产生一种无法解决的紧张情绪,这将伴随你一整天”xkcd.com/859这就是为什么我更喜欢这种情况下的 C 风格强制转换——它们产生的嵌套层次更少。
      【解决方案3】:

      aux.size() 返回一个std::size_t,但sqrt() 没有采用std::size_t 参数的重载版本。

      编译器报告sqrt 有3 个重载:采用floatdoublelong double 参数。 std::size_t 可以转换为其中任何一个,因此存在歧义,因为编译器不知道是否将 std::size_t 转换为 floatdoublelong double

      【讨论】:

        【解决方案4】:

        尝试将您的 aux.size() 转换为其中一种类型,这样就不会模棱两可了...

        【讨论】:

          猜你喜欢
          • 2013-12-13
          • 1970-01-01
          • 1970-01-01
          • 2011-09-19
          • 2011-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多