我无法理解为什么下面的代码无法编译——有人可以解释一下吗?
如何从基类访问派生类中的 typedef?
template<class Derived>
struct Test
{
template<class T>
typename Derived::value_type foo(T);
};
struct Derived : public Test<Derived>
{
typedef int value_type;
};
在声明的时候Derived
,Derived
还不是一个完整的类型——你才刚刚开始声明它!因此,在 specializationTest<Derived>
中,模板参数是不完整的类型,因此您不能引用嵌套名称,例如Derived::value_type
-- 这是循环逻辑。
您可以通过将返回类型作为单独的参数来解决问题:
template <typename T, typename R> struct Test
{
template <typename U> R foo(U);
};
template <typename R>
struct BasicDerived : public Test<BasicDerived, R>
{
typedef R value_type;
};
typedef BasicDerived<int> Derived;
您不能typedef
直接在基类中访问模板类的 s 或成员,因为此时它不是完整的类型。允许这样做会导致循环行为:
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;
};