2

假设我已经声明了一些模板类,并且我想 typedef 一个指向它的共享指针。我该怎么做?

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

2 回答 2

7

您可能还需要模板 typedef。阅读 Sutter 的文章

在 C++03 中,你需要一个 hack:

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

using在 C++11 中,您可以直接通过关键字使用模板别名:

template <typename T>
using ArgPtrType = std::shared_ptr<Arg<T>>;
于 2012-05-03T21:05:58.807 回答
2

那是因为Arg不是真正的类型。Arg<int>例如将是一个。这就是编译器不想编译的原因。你应该这样写,例如:

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

如果你使用 C++11,我想你可以这样写:

template<typename T> class Arg;

template<typename T>
using ArgPtr = std::tr1::shared_ptr<Arg<T>>;
于 2012-05-03T21:05:47.327 回答