typedef общий указатель, содержащий шаблонный класс

Предположим, у меня есть некоторый класс шаблона, объявленный вперед, и я хочу определить общий указатель на него. Как бы я это сделал?

template<typename T> class Arg;
typedef std::tr1::shared_ptr<Arg> ArgPtr; // Compiler error

person Chris Morris    schedule 03.05.2012    source источник
comment
Возможно, связано: менее подробный способ объявления многомерного std::array   -  person ildjarn    schedule 04.05.2012


Ответы (2)


Вы также, вероятно, хотите использовать шаблон typedef. Прочтите статью Саттера.

В С++ 03 вам нужен хак:

template <typename Arg> struct ArgPtr {
     typedef std::shared_ptr<Arg> ArgPtrType;
};

В C++11 вы можете использовать псевдонимы шаблонов напрямую с ключевым словом using:

template <typename T>
using ArgPtrType = std::shared_ptr<Arg<T>>;
person dirkgently    schedule 03.05.2012

Это потому, что Arg на самом деле не тип. Arg<int> например будет один. Поэтому компилятор не хочет компилироваться. Вы должны были написать это, например:

template<typename T> class Arg;
typedef std::tr1::shared_ptr<Arg<int>> ArgPtr;

Если бы вы использовали С++ 11, я думаю, вы могли бы написать это:

template<typename T> class Arg;

template<typename T>
using ArgPtr = std::tr1::shared_ptr<Arg<T>>;
person Morwenn    schedule 03.05.2012