派生对象可以转换为c ++模板类中的基本引用吗?

时间:2016-03-04 10:09:24

标签: c++ templates inheritance reference polymorphism

所有。我正在尝试学习有关模板继承的知识。我想将临时派生对象强制转换为其基本引用。但我遇到了这个问题:

typedef long size64_t;
//////Base class
template <typename _Scalar>
class MatrixBase{
public:
    virtual _Scalar operator()(size64_t rowid, size64_t colid) = 0;
};
//////Derived class 1
template <typename _Scalar>
class MatrixHolder : public MatrixBase<_Scalar>{
public:
    MatrixHolder(){};
    inline _Scalar  operator()(size64_t rowid, size64_t colid){return 0;}
};

//////Derived class 2
template <typename _Scalar>
class Matrix : public MatrixBase<_Scalar>{
public:
    Matrix(){};
    inline _Scalar  operator()(size64_t rowid, size64_t colid){return 0;}
};
//////The function with parameters as Base class reference, wanting to get derived object as input.
template <typename _Scalar>
MatrixHolder<_Scalar> apply(MatrixBase<_Scalar>& lhs, MatrixBase<_Scalar>& rhs){
    MatrixHolder<_Scalar> result;
    return result;
}

在主要方面,我们有:

void main(){
    Matrix<double> m1;
    Matrix<double> m2;
    apply(m1, m2);//Sucess
    apply(m1, apply(m1, m2));//Fail
}

the compiler said:

note: candidate function [with _Scalar = double] not viable: no known conversion from
      'MatrixHolder<double>' to 'MatrixBase<double> &' for 2nd argument
MatrixHolder<_Scalar> apply(MatrixBase<_Scalar>& lhs, MatrixBase<_Scalar>& rhs){
                      ^
1 error generated.

1 个答案:

答案 0 :(得分:1)

apply(m1, apply(m1, m2));//Fail

这里的问题是内部apply返回一个临时的,它不能绑定到外部apply的非const引用参数。

如果您可以设置参数MatrixBase<_Scalar> const&,则可能是匹配。