www.boolean.name

www.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   std::vector как шаблонный параметр (http://forum.boolean.name/showthread.php?t=19244)

wolfhound512 14.06.2014 10:26

std::vector как шаблонный параметр
 
Допустим есть шаблон:

Код:

template <template <class ...> class Container>
class Node {
public:
        Node() {}
private:
        Container<Node*> _list;
};

Если в качестве контейнера указать std::vector
Код:

Node<std::vector> n;
То компилятор выдает следующее: error C2976: std::vector: слишком мало аргументов шаблон.
Вообще std::vector имеет два аргумента, но ведь у второго задано значение по умолчанию, почему он его игнорирует?

З.Ы. Использую Visual Studio 2013

CX_14_fd 14.06.2014 21:06

Ответ: std::vector как шаблонный параметр
 
Аргументируй правильно например так <int, std::vector<int>

Mr_F_ 14.06.2014 21:12

Ответ: std::vector как шаблонный параметр
 
Цитата:

То компилятор выдает следующее: error C2976: std::vector: слишком мало аргументов шаблон.
так не получится, vector класса без шаблонных параметров в принципе не существует, ты либо задаёшь контейнер через #define тогда, либо делаешь Node<vector<Node*>>
----
либо забиваешь на выдумывание странных архитектур и избегаешь такой ситуации

wolfhound512 15.06.2014 07:30

Ответ: std::vector как шаблонный параметр
 
Цитата:

так не получится, vector класса без шаблонных параметров в принципе не существует
Ему и не нужно существовать, т.к. существуют шаблонные шаблонные параметры.

Проблема первого поста заключается в отсутствии второго аругмента в строке:
Код:

Container<Node*> _list;
потому что std::vector имеет два шаблонных параметра (хотя второй и задан по умолчанию, но почему-то игнорируется)
если писать так:
Код:

template <template <class ...> class Container>
class Node {
public:
        Node() {}
private:
        Container<Node*, std::allocator<Node*>> _list;
};

Node<std::vector> n;

То все работает, но шаблон тогда получается привязан к std::allocator, чего хочется избежать.

Сделал менее удобным, но более гибким способом
Код:

template <class T> struct stdVector { typedef std::vector<T> type; };

template <template <typename ...> class Container>
class Node {
public:
        Node() {}

private:
        typename Container<cNode*>::type _list;
};

...

Node<stdVector> n;



Часовой пояс GMT +1, время: 16:52.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Перевод: zCarot