gpt4 book ai didi

c++ - 无法返回派生类(无法转换)

转载 作者:太空宇宙 更新时间:2023-11-04 12:51:59 24 4
gpt4 key购买 nike

我有以下派生类,它是 Eigen::Tensor 的子类

template<int T>
class TensorD : public Eigen::Tensor<float, T>{
private:
int tDim = -1;
public:
typedef Eigen::Tensor<float, T> Base;

TensorD(){
tDim = T;
}

TensorD( const Base &d ) : Base(d)
{
tDim = T;
}

~TensorD(){

}

TensorD<3> dot(const TensorD<2>& x){
Eigen::Tensor<float, 3>& A = *this;
const Eigen::Tensor<float, 2>& B = x;

Eigen::array<Eigen::IndexPair<int>, 1> product_dims = { Eigen::IndexPair<int>(2, 0) };
return A.contract(B, product_dims);

//return AB;
}

};

dot() 方法中,如果我尝试 return 如上所示,我会得到一个错误:

error: could not convert ‘((Eigen::TensorBase<Eigen::Tensor<float, 3, 0, long int>, 0>*)(& A))->Eigen::TensorBase<Derived, 0>::contract<Eigen::Tensor<float, 2>, std::array<Eigen::IndexPair<int>, 1ul> >((* & B), product_dims)’ from ‘const Eigen::TensorContractionOp<const std::array<Eigen::IndexPair<int>, 1ul>, const Eigen::Tensor<float, 3, 0, long int>, const Eigen::Tensor<float, 2> >’ to ‘TensorD<3>’
return A.contract(B, product_dims);

但是,如果我这样做:

Eigen::Tensor<float, 3> AB = A.contract(B, product_dims);

return AB;

然后编译。

这是为什么?如何避免重复复制?

最佳答案

编译器不允许包含多个用户定义转换的隐式转换序列。我不熟悉 Eigen;纯粹从你的描述来看,它似乎利用了表达式模板。 A.contract(...) 不返回 Eigen::Tensor,而是返回某个名为 Eigen::TensorContractionOp 的类的实例这大概可以转换为 Eigen::Tensor - 但不能转换为您的 TensorD,因为这需要两次用户定义的转换。

一旦您通过引入中间变量来拆分链,一切都会开始工作。使用 AB,您可以从 Eigen::TensorContractionOpEigen::Tensor 进行隐式转换,然后从 进行单独转换>Eigen::TensorTensorD

关于c++ - 无法返回派生类(无法转换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48676109/

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