Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c++;模板类?_C++_Templates_Inheritance_Reference_Polymorphism - Fatal编程技术网

C++ 在c++;模板类?

C++ 在c++;模板类?,c++,templates,inheritance,reference,polymorphism,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 temp

全部。我正在努力学习一些关于模板继承的知识。我想将临时派生对象强制转换为其基本引用。但我遇到了这个问题:

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;
}
typedef长尺寸64;
//////基类
模板
类矩阵基{
公众:
虚拟标量运算符();
};
//////派生类1
模板
类MatrixHolder:公共MatrixBase{
公众:
MatrixHolder(){};
内联_标量运算符()(size64_t rowid,size64_t colid){返回0;}
};
//////派生类2
模板
类矩阵:公共矩阵库{
公众:
矩阵(){};
内联_标量运算符()(size64_t rowid,size64_t colid){返回0;}
};
//////以参数作为基类引用的函数,希望获取派生对象作为输入。
模板
MatrixHolder应用(MatrixBase&lhs、MatrixBase&rhs){
矩阵结果;
返回结果;
}
总的来说,我们有:

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.
void main(){
矩阵m1;
矩阵m2;
应用(m1,m2);//成功
应用(m1,应用(m1,m2));//失败
}
编辑说:
注:候选函数[with _Scalar=double]不可行:没有已知的从
第二个参数的“MatrixHolder”到“MatrixBase&”
MatrixHolder应用(MatrixBase&lhs、MatrixBase&rhs){
^
生成1个错误。
这里的问题是,内部的
apply
返回一个临时值,它不能绑定到外部的
apply
的非常量引用参数


如果您可以使参数
MatrixBase常量&
,则可能匹配。

我认为您的问题是使用double作为模板参数。如图所示,似乎不可能。您正在尝试将非常量引用绑定到临时对象。使参数
应用
常量引用。@molbdnilo意味着所有临时对象都应该是const?@maple否,函数的参数应该是;
const MatrixBase&rhs
(顺便说一下,这与模板或继承无关。)@StefanReinhardt使用类型double作为模板参数不是问题。链接到的问题是使用浮点值作为模板参数。
apply(m1, apply(m1, m2));//Fail