Общая специализация шаблона класса с шаблоном контейнера - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь создать класс непересекающихся множеств, который работает для различных типов контейнеров в stl (вектор, dequeue и массив) с шаблоном, но у меня возникают проблемы с выполнением специализации для контейнера массива, так как он имеет другую инициализациючем вектор и деку.Array принимает два аргумента, а два других - один.Вот что я пытался сделать:

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 ]

1 голос
/ 25 мая 2019

Компилятор выдает ошибку, поскольку в качестве параметра шаблона шаблона вводится тип. Предполагая, что специализация для любого N нежелательна, и она также должна использоваться с другими контейнерами (вектор и deque), которые формируются по-разному, правильный путь выглядит следующим образом:

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(...);

Удачи!

1 голос
/ 24 мая 2019

Это не работает, поскольку параметр шаблона шаблона 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>>{
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...