我在operator []
的代理类中遇到错误。它正在检查索引是否在范围内,并且当我使用T** values.
但我觉得要将整个实施改为std::vector<std::vector<T>>
。一切都很好,期待operator[]
。
Matrix类运算符
//***************************************************************************
template <typename T>
X_Proxy<T> Matrix<T>::operator [](const size_t& j)
{
if(j >= y)
ERROR_MSG(Y_OUT_RANGE);
return X_Proxy<T>(inner[j], x);
}
//***************************************************************************
template <typename T>
const X_Proxy<T> Matrix<T>::operator [](const size_t& j) const
{
if(j >= y)
ERROR_MSG(Y_OUT_RANGE);
return X_Proxy<T>(inner[j], x);
}
//***************************************************************************
代理类模板定义:
template <typename T>
struct X_Proxy
{
X_Proxy(std::vector<T> PTR, const size_t X) : x_ptr(PTR), x(X) {}
T& operator [] (size_t pos);
const T& operator [] (size_t pos) const;
std::vector<T>& x_ptr;
const size_t& x;
};
代理类操作符:
//***************************************************************************
template <typename T>
T& X_Proxy<T>::operator [] (size_t pos)
{
if (pos > x-1)
Matrix<T>::ERROR_MSG(Matrix<T>::X_OUT_RANGE);
return x_ptr[pos];
}
//***************************************************************************
template <typename T>
const T& X_Proxy<T>::operator [] (size_t pos) const
{
if (pos > x-1)
Matrix<T>::ERROR_MSG(Matrix<T>::X_OUT_RANGE);
return x_ptr[pos]; // <--- the error line
}
//***************************************************************************
矩阵错误功能:
template <typename T>
void Matrix<T>::ERROR_MSG(const int& MSG)
{
std::cerr << info[MSG] << std::endl;
exit(MSG);
}
编译错误:
..\matrix.h:47: error: returning reference to temporary [-Wreturn-local-addr]
return x_ptr[pos];
^
我们可爱的模板库会出现什么问题?
答案 0 :(得分:3)
您的X_Proxy
构造函数正在存储对临时的引用:
X_Proxy(std::vector<T> PTR, const size_t X) : x_ptr(PTR), x(X) {}
此处,PTR
是本地临时,x_ptr
是左值参考:
std::vector<T>& x_ptr;
这不是标准的C ++,所以它甚至不应该编译。但是你的编译器允许它,给你一个悬空引用。
也许你想存储对有效矢量的引用:
X_Proxy(std::vector<T>& PTR, const size_t X) : x_ptr(PTR), x(X) {}
^
只要PTR
引用的向量比X_Proxy
实例更长,就会有效。