如何解决错误:无法从int转换为float&在第4行

时间:2015-11-21 08:56:26

标签: c++

inline float& Matrix::operator()(const int ax, const int ay) const {
#ifdef _DEBUG
    if (ax >= ivWidth || ay >= ivHeight || ax < 0 || ay < 0) {
        std::cerr << "Exception EMatrixRangeOverflow: x = " << ax << ", y = " << ay << std::endl;
        return 0; // line 4: here the problem!
    }
#endif
    return ivData[ivWidth * ay + ax];
}

错误在第4行:return 0

2 个答案:

答案 0 :(得分:1)

inline float& Matrix::operator()(const int ax, const int ay) const {
     

[...]

        return 0; // line 4: here the problem!
     

[...]

}

您的问题可以简化为:

float& f()
{
    return 0;
}

甚至更进一步:

int main()
{
    float& f = 0;
}

事实上,这根本没有意义。您正在尝试创建一个整数文字的非const引用。这怎么可能有效呢? 就好像你想要修改值本身的含义一样。 C ++不允许这样做。零意味着零,将永远这样做。

float&必须始终引用实际可修改的float对象(或可修改的float - 兼容对象)。因此,没有适合返回float&的函数的特殊值或错误返回码。

这个理论太多了。现在,该怎么办呢?

  1. float&成员函数中返回const看起来非常错误。您几乎肯定想要返回float

  2. 要报告错误,请抛出异常或使用assert

  3. 抛出异常:

    inline float Matrix::operator()(const int ax, const int ay) const {
    #ifdef _DEBUG
        if (ax >= ivWidth || ay >= ivHeight || ax < 0 || ay < 0) {
            throw std::runtime_error("Exception EMatrixRangeOverflow: x = " + std::to_string(ax) + ", y = " + std::to_string(ay));
        }
    #endif
        return ivData[ivWidth * ay + ax];
    }
    

    断言:

    inline float Matrix::operator()(const int ax, const int ay) const {
        assert(!(ax >= ivWidth || ay >= ivHeight || ax < 0 || ay < 0));
        return ivData[ivWidth * ay + ax];
    }
    

    请注意,您实际上并不需要_DEBUG宏。标准NDEBUG用于控制assert的行为。

答案 1 :(得分:-1)

inline float&中的问题&,这意味着您必须返回一个对象(float)或成员或variable(还有其他内容)......

我不知道您尝试为&做些什么,但您可以修改它以添加member in classgeneral variable

float ZERO = 0;
inline float& Matrix::operator()(const int ax, const int ay) const {
#ifdef _DEBUG    
    if (ax >= ivWidth || ay >= ivHeight || ax < 0 || ay < 0) {
        std::cerr << "Exception EMatrixRangeOverflow: x = " << ax << ", y = " << ay << std::endl;
        return ZERO; // here the fix
    }
#endif
    return ivData[ivWidth * ay + ax];
}

引用(&)必须指向variableobject,在您的情况下为variable of float