繁体   English   中英

返回专用模板类的协变量类型

[英]Return covariant type of specialized template class

我具有以下类层次结构:

template<typename T>
class GridMetric{
  virtual GridMetric* getNeighbors(T value) = 0;
};

template<size_t N, typename T, typename Derived>
class MatrixBase : public GridMetric<T>{
  virtual MatrixBase<N,T,Derived>* getNeighbors(T value){return nullptr;}
};

template<size_t N, typename T>
class MatrixND : public MatrixBase<N,T,MatrixND<N,T>>{
  virtual MatrixND<2,T>* getNeighbors(T value){ /* ... */}
};

template<typename T>
class MatrixND<2,T> : public MatrixBase<2,T,MatrixND<2,T>>{
  virtual MatrixND<2,T>* getNeighbors(T value){ /* ... */}
};

template<typename T>
class Vector : public GridMetric<T>{
  virtual MatrixND<2,T>* getNeighbors(T value){ /* ... */}
};

因此,我的抽象类GridMetric具有两个派生类,即Vector和MatrixBase。 我的Matrix Base类具有crtp样式派生的类MatrixND,并且MatrixND具有N = 2的特殊化。

每个类都应具有一个虚函数getNeighbors以返回MatrixND <2,T>指针。

一切正常,除了MatrixND类抱怨MatrixND <2,T>是无效的协变量返回类型:

error: invalid covariant return type for ‘MatrixND<2ul, T>* MatrixND<N, T>::getNeighbors(T&) [with long unsigned int N = 3ul; T = double]’
  virtual MatrixND<2,T>* getNeighbors(T& in){

我的第一个问题是为什么以及如何处理? 由于MatrixND <2,T>继承自MatrixBase!

我的第二个问题:设计不好,因为我总是会返回原始指针吗? 我读了很多返回新obj ..的表达式,但是这显然是错误的设计。 还有其他实现相同目标的可能性吗?

编辑:所以,过了一段时间,我意识到原来的计划是不会制定出来的,我通过在我想使用这些类的模板上进行模板化找到了一个更简单的解决方案。

无论如何,问题仍然存在,为什么专用MatrixND类不能在常规MatrixND类中成为协变返回类型。 我没有发现任何禁止的信息。

  • MatrixND<2,T> (基本情况),无需解释。
  • Vector<T>GridMetric<T> Vector<T>继承的,因此从GridMetric<T>派生的任何内容(包括MatrixND<2,T> )都可以。

但是,一般形式MatrixND<N,T>N != 2)继承自MatrixBase<N,T,MatrixND<N,T>> ,将虚拟函数重新定义为:

virtual MatrixBase<N,T,Derived>* getNeighbors(T value){return nullptr;}

这迫使MatrixND<N,T>的返回类型现在(至少)从MatrixBase<N,T,MatrixND<N,T>>
不是来自GridMetric<T> (对于Vector<T> )或MatrixBase<2,T,MatrixND<2,T>> (对于特殊化MatrixND<2,T> ),而是: MatrixBase<N,T,MatrixND<N,T>> ,其中( N != 2)。

为什么这不是协变返回类型? 因为当N != 2时MatrixND<2,T>不会从MatrixBase<N,T,MatrixND<N,T>>继承。

删除MatrixBase<N,T,MatrixND<N,T>>中的函数重新定义或将其返回类型更改为GridMetric<T> ,这将起作用(因为MatrixND<2,T>继承自GridMetric<T> )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM