错误C2440:'=':无法从'div_t'转换为'double'

时间:2017-08-15 07:59:37

标签: c++

我是初学者,我的英语不太好,所以先抱歉。 1.我试图编译这段代码,我不明白问题 - 函数div返回'double',所以为什么我不能写这行:“sum = div(x,y);” ?我试图在这里找到答案并谷歌它但它不起作用。 2.除此之外,有人知道这个问题的解决方案是什么 - 1>完成建筑项目“test.vcxproj” - 失败。 ? 谢谢你的答案!

#pragma once
#include <iostream>
#include <string.h>

using namespace std;
class DivisionByZero
{
private:
    const char* zero_description = "error: division by zero";
public:
    const char* getZero() {return zero_description;}
    void printZero() { cout << getZero() << endl; }
};

double div(double x, double y) throw(int, DivisionByZero) {
    if (x < y)
        throw - 1;
    if (y == 0)
        throw DivisionByZero();
    cout << x / y << endl;
    return x / y;
}


#include "DivisionByZero.h"

using namespace std;

int main()
{
    try {
        int x, y;
        double sum;
        cout << "insert x and  y values" << endl;
        cin >> x >> y;
        sum= div(x, y);
    }
    catch (int a) {
        if (a == -1)
            cout << "x is smaller than y" << endl;
    }
    catch (DivisionByZero& c) {
        c.printZero();
    }
    catch (...) {
        cout << "unknown error" << endl;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

问题是标准库还包含a div function,它需要两个ints并返回div_t结构。由于您在int函数调用中传递了两个div(x, y),因此重载决策会在您自己的std::div函数上选择div。因此,您最终会尝试将div_t结构分配给double变量,这会导致您看到错误消息。

有些编译器还会将div带入顶级命名空间(我不确定这是否由标准定义),因此即使没有using namespace std;,这也许并不总是有效。 / p>

最简单的解决方法(对于阅读代码的其他人来说最不容易混淆)只是将您自己的div函数重命名为其他内容。

这是using namespace std;被某些人不赞同的原因之一。将using namespace指令放在头文件中是特别糟糕的做法,因为它们污染了包括该头文件在内的任何源文件的范围。 (我假设您的代码段的第一部分实际上是DivisionByZero.h的内容。)