使用容器模板的总类模板专业化

时间:2019-05-24 19:56:44

标签: c++ class templates containers

我正在尝试使用模板创建一个不相交的集合类,该集合类适用于stl(向量,出队和数组)中的不同容器类型,但是由于数组容器具有不同的初始化,因此我无法对数组容器进行专门化处理而不是向量和出队。数组采用两个参数,而其他两个采用一个。这是我尝试做的事情:

template <int N,template<typename ,typename...>class Container>

class disjoint_set{

private:

    Container<int> vertices;
    Container<int> root;
.
.
.

template <int N> //Class specialization for array
class disjoint_set<N,std::array<int,N>>{

private:

    Container<int> vertices;
    Container<int> root;
.
.
.

我收到以下错误: 模板模板参数的模板参数必须是类模板或类型别名模板

2 个答案:

答案 0 :(得分:1)

这不起作用,因为在传递Container时,模板模板参数int被声明为具有第二个参数的类型。可以很容易地解决这个问题:

template <int N, typename Container>
class disjoint_set{

template <int N> //Class specialization for array
class disjoint_set<N, std::array<int, N>>{

答案 1 :(得分:1)

由于输入了类型作为模板模板参数,编译器给出了错误。假设不需要任何N的专业化,并且它也应与其他形式不同的容器(向量和双端队列)一起使用,正确的方法如下:

template <class Container> // template <typename Container>

class disjoint_set{

private:

    Container vertices;
    Container root;
.
.
.
};

没有任何专长。除非disjoint_set对于每种类型的容器的行为确实不同。
并且应该在构造对象时简单地指定容器,例如:

disjoint_set<std::array<int, 56> > object1(...);
disjoint_set<std::vector<int> > object2(...);
disjoint_set<std::deque<int> > object3(...);

祝你好运!