テンプレートクラスを前方宣言していて、それへの共有ポインターをtypedefしたいとします。どうすればいいですか?
template<typename T> class Arg;
typedef std::tr1::shared_ptr<Arg> ArgPtr; // Compiler error
テンプレートクラスを前方宣言していて、それへの共有ポインターをtypedefしたいとします。どうすればいいですか?
template<typename T> class Arg;
typedef std::tr1::shared_ptr<Arg> ArgPtr; // Compiler error
テンプレートtypedefも必要になるでしょう。Sutterの記事を読んでください。
C ++ 03では、次のようにハックする必要があります。
template <typename Arg> struct ArgPtr {
typedef std::shared_ptr<Arg> ArgPtrType;
};
using
C ++ 11では、次のキーワードを使用してテンプレートエイリアシングを直接使用できます。
template <typename T>
using ArgPtrType = std::shared_ptr<Arg<T>>;
それArg
は実際にはタイプではないからです。Arg<int>
たとえば、1つになります。そのため、コンパイラはコンパイルを望んでいません。たとえば、次のように書く必要があります。
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>>;