C++ 从T**重建到vec时返回对临时错误的引用<;vec<;T>&燃气轮机;

C++ 从T**重建到vec时返回对临时错误的引用<;vec<;T>&燃气轮机;,c++,matrix,vector,C++,Matrix,Vector,我遇到了一个错误,该错误发生在我的操作符[]的代理类中。当我用T**值实现我的类模板时,它正在检查索引是否在范围内,并且运行良好。 但我想将整个实现更改为std::vector。一切都很好,除了操作员[] 矩阵类算子 我们可爱的模板库会出什么问题?您的X\u代理构造函数正在存储对临时模板库的引用: X_Proxy(std::vector<T> PTR, const size_t X) : x_ptr(PTR), x(X) {} 这不是标准C++,所以它不应该编译。但您的编译器允许这

我遇到了一个错误,该错误发生在我的
操作符[]
的代理类中。当我用
T**值实现我的类模板时,它正在检查索引是否在范围内,并且运行良好。

但我想将整个实现更改为
std::vector
。一切都很好,除了操作员[]

矩阵类算子


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

您的
X\u代理
构造函数正在存储对临时模板库的引用:

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

这不是标准C++,所以它不应该编译。但您的编译器允许这样做,给您留下了一个悬而未决的引用

也许您希望存储对有效向量的引用:

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

只要
PTR
引用的向量在
X_代理
实例之外,这将起作用。

您的
X_代理
构造函数正在存储对临时代理的引用:

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

这不是标准C++,所以它不应该编译。但您的编译器允许这样做,给您留下了一个悬而未决的引用

也许您希望存储对有效向量的引用:

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

只要
PTR
引用的向量比
X_Proxy
实例长,这就可以工作。

我刚才发现了,但是当我将参数更改为
std::vector&PTR
时,我会得到大约40个转换错误。。。就像它在和常量斗争一样。问题是,
矩阵算子[](…)常数
不会被接受为非常量参数。@BlackMoses可能您正在传递对
常量的引用。无论如何,这听起来像是另一个问题,需要一个不同的MCVE。对于
Matrix
声明的
const
@BlackMoses>对象,我必须传递const,不是我,而是编译器。这是另一个问题。您可能需要使用
eturn X_代理(内部[j],X)用于
const
重载。
错误:调用'X_Proxy::X_Proxy(const-value\u-type&,const-size\u-t&)'返回X_-Proxy(内部[j],X]时没有匹配函数
注意:没有已知的参数1从'const value_type{aka const std::vector}到'std::vector&'
的转换,我刚才发现了,但是当我将参数更改为
std::vector&PTR
时,我得到了大约40个转换错误。。。就像它在和常量斗争一样。问题是,
矩阵算子[](…)常数
不会被接受为非常量参数。@BlackMoses可能您正在传递对
常量的引用。无论如何,这听起来像是另一个问题,需要一个不同的MCVE。对于
Matrix
声明的
const
@BlackMoses>对象,我必须传递const,不是我,而是编译器。这是另一个问题。您可能需要使用
eturn X_代理(内部[j],X)用于
const
重载。
错误:调用'X_Proxy::X_Proxy(const-value\u-type&,const-size\u-t&)'返回X_-Proxy(内部[j],X]时没有匹配函数
注意:参数1从'const value_type{aka const std::vector}'到'std::vector&'的转换未知。
..\matrix.h:47: error: returning reference to temporary [-Wreturn-local-addr]
         return x_ptr[pos];
                         ^
X_Proxy(std::vector<T> PTR, const size_t X) : x_ptr(PTR), x(X) {}
std::vector<T>& x_ptr;
X_Proxy(std::vector<T>& PTR, const size_t X) : x_ptr(PTR), x(X) {}
                      ^