基本クラスのテンプレートクラスまたはテンプレートクラスのメンバーに直接アクセスすることはできませんtypedef
。その時点では、完全な型ではないためです。これを許可すると、循環動作につながります。
template<class Derived>
struct Test
{
typedef typename Derived::value_type foo;
};
struct Derived : public Test<Derived>
{
typedef Test<Derived>::foo value_type;
};
ただし、メソッド内でテンプレートクラスのメンバーを参照することはできます。これらのメンバーは、後でインスタンス化されるまではインスタンス化されないためです。
template<class Derived>
struct Test
{
void foo() { typename Derived::value_type bar; }
};
struct Derived : public Test<Derived>
{
typedef int value_type;
};
または、目的に応じて、typedefを追加のテンプレートパラメーターとして渡すことができます。
template<typename value_type, class Derived>
struct Test
{
template<class T>
value_type foo(T);
};
struct Derived : public Test<int, Derived>
{
typedef int value_type;
};