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
。
答案 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&
的函数的特殊值或错误返回码。
这个理论太多了。现在,该怎么办呢?
在float&
成员函数中返回const
看起来非常错误。您几乎肯定想要返回float
。
要报告错误,请抛出异常或使用assert
。
抛出异常:
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 class
或general 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];
}
引用(&
)必须指向variable
或object
,在您的情况下为variable of float