【问题标题】:Total class template specialization with container template带有容器模板的总类模板特化
【发布时间】:2019-05-24 19:56:43
【问题描述】:

我正在尝试使用模板创建一个不相交的集合类,该类适用于 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;
.
.
.

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

【问题讨论】:

  • 我发布了一个答案。如果有帮助,请考虑投票/接受。
  • 第一个(更通用的)模板的N 参数的目的是什么?
  • @JaMiT 将它用于 disjoint_set 构造函数,因为对于 std::array 您必须为每个对象的参数传递值。这样我就可以在构造函数中使用 N 。如果有另一种方式,我很想知道!
  • @AGH97 如果构造函数是相关的,那么它应该是问题的一部分。另外,我以为您只在专业化中使用std::array,而不是在更通用的模板中。
  • @JaMiT 这不是我只在专业化中使用我不认为你可以在与 std::vector 或 std::deque 相同的模板中实现它,因为它需要额外的其构造函数 中的参数,所以我选择了专门化它。代码最终看起来像这样pastebin.com/kwumFprp,如果有更好的方法可以做到这一点!

标签: c++ class templates containers


【解决方案1】:

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

template <int N, typename Container>
class disjoint_set{

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

【讨论】:

  • 感谢您的回答,这也让我可以使用 N 作为 disjoint_set 构造函数,这样我就可以拥有一个没有参数的构造函数! (使 std::array 专业化的生活更轻松)
【解决方案2】:

编译器给出错误,因为输入了一个类型作为模板模板参数。假设不需要对任何 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(...);

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多