C++编译器错误:对重载函数的调用不明确
C++ compiler error: ambiguous call to overloaded function
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)'
为什么?
string::size()
返回size_t
,而sqrt
在其任何版本中都不接受它。所以编译器必须进行强制转换,而不能选择什么-所有这些都可以
maxy = (int)sqrt((double)aux.size());
问题是,在C++中,有三个名为sqrt
的函数,一个取float
,一个用double
,一个拿long double
。当您尝试呼叫时
sqrt(aux.size());
编译器试图确定要调用这些函数中的哪一个。由于aux.size()
返回一个string::size_type
,它既不是float
、double
,也不是long double
,所以它试图查看string::size_type
是否可以隐式转换为这三个值中的任何一个。但是,由于string::size_type
可以转换为这三种类型,编译器会将调用标记为不明确,因为不清楚要进行哪种转换
要解决此问题,可以将aux.size()
显式转换为所需的类型。例如:
sqrt(double(aux.size()));
或
sqrt(float(aux.size()));
这使得调用明确地匹配两个函数中的一个。根据所需的精度,可以选择三种重载中的任何一种。由于您只是将类型转换回int
,因此在这里可能可以将类型转换为float
。
aux.size()
返回一个std::size_t
,但sqrt()
没有采用std::size_t
参数的重载版本。
编译器报告sqrt
有3个重载:它们接受float
、double
和long double
参数。std::size_t
可以转换为任何一个,因此存在歧义,因为编译器不知道是将std::size_t
转换为float
,还是将double
或long double
。
尝试将aux.size((转换为其中一种类型,这样就不会有歧义。。。
相关文章:
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 返回指向对象的指针的函数调用是否为 prvalue?
- C++ 如何重载 [] 运算符并进行函数调用
- 代码的效率. 转到和函数调用
- 是同一作用域的函数部分中的函数调用
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 类型擦除的std::function与虚拟函数调用的开销