当前位置:首页C++程序设计 > 正文

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
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击