我有以下派生类,它是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;
然后编译。
这是为什么?我怎样才能避免双重复制?
答案 0 :(得分:0)
编译器不允许包含多个用户定义转换的隐式转换序列。我不熟悉Eigen
;纯粹来自您的描述,它似乎利用表达模板。 A.contract(...)
不会返回Eigen::Tensor
,而是返回名为Eigen::TensorContractionOp
的某个类的实例,该类可能可转换为Eigen::Tensor
- 但不会返回TensorD
,这将需要两个用户定义的转换。
一旦通过引入中间变量拆分链,一切都会开始工作。有了AB
,您就会有Eigen::TensorContractionOp
到Eigen::Tensor
的隐式转换,然后是从Eigen::Tensor
到TensorD
的单独转换。