无法返回派生类(无法转换)

时间:2018-02-08 01:35:48

标签: c++

我有以下派生类,它是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;

然后编译。

这是为什么?我怎样才能避免双重复制?

1 个答案:

答案 0 :(得分:0)

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

一旦通过引入中间变量拆分链,一切都会开始工作。有了AB,您就会有Eigen::TensorContractionOpEigen::Tensor的隐式转换,然后是从Eigen::TensorTensorD的单独转换。