gpt4 book ai didi

c++ - 从 T ** reshape 为 vec> 时返回对临时错误的引用

转载 作者:行者123 更新时间:2023-11-28 00:07:30 26 4
gpt4 key购买 nike

我在我的代理类中遇到了一个错误 operator [] .它正在检查索引是否在范围内,并且在我使用 T** values. 实现我的类模板时工作正常

但我想将整个实现更改为 std::vector<std::vector<T>> .一切都很好,期待说operator[] .

矩阵类运算符

//***************************************************************************
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];
^

我们可爱的模板库可能出了什么问题?

最佳答案

您的 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++,所以它甚至不应该编译。但是你的编译器允许它,给你留下一个悬空的引用。

也许您想存储对有效 vector 的引用:

X_Proxy(std::vector<T>& PTR, const size_t X) : x_ptr(PTR), x(X) {}
^

只要 PTR 引用的 vector 比 X_Proxy 实例长,这就会起作用。

关于c++ - 从 T ** reshape 为 vec<vec<T>> 时返回对临时错误的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34694007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com