我正在尝试使用模板创建一个不相交的集合类,该集合类适用于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;
.
.
.
我收到以下错误: 模板模板参数的模板参数必须是类模板或类型别名模板
答案 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(...);
祝你好运!