dev c++ 运行报错 [Error] call of overloaded \'setValue(double)\' is ambiguous
作者:野牛程序员:2023-04-17 12:11:53C++程序设计阅读 2687
#include <iostream> using namespace std; union myUnion { int a; float b; void setValue(int x) { a = x; } void setValue(float x) { b = x; } void printValue() { cout << "a = " << a << ", b = " << b << endl; } }; int main() { myUnion u; u.setValue(123); u.printValue(); // 输出 a = 123, b = 1.4013e-45 u.setValue(3.14); u.printValue(); // 输出 a = 1078523331, b = 3.14 return 0; }
这是因为在 C++ 中,浮点型常量默认被解释为 double
类型,而在 myUnion
中,我们定义了两个重载的 setValue
函数,分别接受 int
类型和 float
类型的参数。因此,当你调用 u.setValue(3.14)
时,编译器无法确定应该调用哪一个 setValue
函数,因为它既可以将 3.14
解释为 float
类型,也可以将其解释为 double
类型。
为了解决这个问题,你可以将 3.14
显式地转换为 float
类型,例如:
u.setValue(static_cast<float>(3.14));
或者将 myUnion
中的 setValue
函数改为只接受 float
类型的参数,例如:
union myUnion { int a; float b; void setValue(int x) { a = x; } void setValue(float x) { b = x; } void printValue() { cout << "a = " << a << ", b = " << b << endl; } };
正确代码如下:
#include <iostream> using namespace std; union myUnion { int a; double b; void setValue(int x) { a = x; } void setValue(float x) { b = x; } void printValue() { cout << "a = " << a << ", b = " << b << endl; } }; int main() { myUnion u; u.setValue(123); u.printValue(); // 输出 a = 123, b = 1.4013e-45 u.setValue((float)3.14); u.printValue(); // 输出 a = 1078523331, b = 3.14 return 0; }
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
