定义一个模板类,但得到的不是一个类模板'

时间:2017-09-21 18:03:09

标签: c++ templates

我们试图使用模板定义一个类:

template<typename _VType, size_t _Len>
class Obc<_VType,_Len> {
  private:
    size_t len = _len;
  public:
    Obc();
    Obc(_VType *values);
    ...
};

并且,我们希望能够像:

一样使用它
Obc<_DType, 2> m = new Obc();

然而,&#34;'Matrix'不是一个类模板&#34;编译时。

我们通过搜索&#39;而不是类似模板&#39;找到了解决方案,如'X is not a template' error,但没有运气

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

不要重复模板参数:

template<typename _VType, size_t _Len>
class Obc {
  ...
};

假设_DType是现有类型,请使用包含模板参数的模板类,而不使用java语法,例如:

Obc<_DType, 2> m;
Obc<_DType, 2> mat{values};    // assuming _DType *values point to something
auto othermat = mat; 

Online demo

答案 1 :(得分:0)

  

我们试图使用模板定义一个类:

template<typename _VType, size_t _Len>
class Obc<_VType,_Len> {
  private:
    size_t len = _Len;
  public:
    Obc();
    Obc(_VType *values);
    ...
};
and, we expected to be able to use it like:

使用中的编译器认为Obc是一种特殊化,它不是,因此错误是“X不是模板”:

下面的例子更清楚地解释了它(见评论):

template <typename VType, size_t Len> 
class Obc { //Non-specialized
  private:
    size_t len = Len;
  public:
    Obc(){}
    Obc(VType *values){}
};

template<typename VType>
class Obc<VType,5> { //Partially specialized for size_t = 5
  //... expects non-specialized declaration
  private:
    size_t len = 5;
  public:
    Obc(){}
    Obc(VType *values){}
};

class X{};

int main() {
  // Using new like this... bad style... leak...
  auto m = new Obc<X, 5>(); //Instantiates specialization
  auto n = new Obc<X, sizeof(X)>(); //Instantiates original
  // your code goes here
  return 0;
}
BTW,使用new来创建Obc意味着它是在堆上创建的,这是(1)并不总是必要的,并且(2),当完成时,应该被解除分配。在这种情况下,它应该包含某种smart_ptr,例如unique_ptr或shared_ptr,具体取决于所有权语义:

相反(在上面的例子中):

...
  Obc<X, 5> m{}; //Instantiates specialization
//or
  auto ptr = std::make_shared<Obc<X,5>>(); 
  //...Or some other smart pointer type
...