Предположим, у меня есть некоторый класс шаблона, объявленный вперед, и я хочу определить общий указатель на него. Как бы я это сделал?
template<typename T> class Arg;
typedef std::tr1::shared_ptr<Arg> ArgPtr; // Compiler error
Предположим, у меня есть некоторый класс шаблона, объявленный вперед, и я хочу определить общий указатель на него. Как бы я это сделал?
template<typename T> class Arg;
typedef std::tr1::shared_ptr<Arg> ArgPtr; // Compiler error
Вы также, вероятно, хотите использовать шаблон 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>>;
Это потому, что 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>>;