создание шаблонных контейнеров, которые сами являются типами shared_ptr - PullRequest
0 голосов
/ 24 апреля 2018

У меня возникли некоторые трудности с тем, чтобы обернуть голову вокруг этого, вероятно, из-за того, что я не полностью понимаю основную механику.

У меня есть структура, подобная следующей:

template <class T>
struct A {
    int id;
    T x;
}

Эта структура затем используется как тип для shared_ptr:

typedef std::shared_ptr<A> A_ptr;

, которая, в свою очередь, сохраняется вкарта:

typedef unordered_map<int , A_ptr> AMap;

Однако, когда я компилирую, я получаю следующую ошибку:

> error: type/value mismatch at argument 1 in template parameter list
> for 'template<class _Tp> class std::shared_ptr'   typedef
> std::shared_ptr<A> A_ptr;

Я прочитал другие посты об аналогичной проблеме, но все они рекомендуют создатьshared_ptr А внутри структуры.Я пробовал это, хотя я не могу логически понять, почему это помогло бы решить мою проблему, но это не работает.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 24 апреля 2018

A - это имя шаблона, а не имя класса. Если бы вы назвали специализацию, ваш typedef был бы в порядке:

typedef std::shared_ptr<A<int>> A_int_ptr; // A<int> **is** a class

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

template<typename T>
using A_ptr = std::shared_ptr<A<T>>;

template<typename T>
using AMap = std::unordered_map<int , A_ptr<T>>;

Теперь все правильно настроено, и экземпляры зависят от типа T, который вы намереваетесь передать на A.

...