4

我无法理解为什么下面的代码无法编译——有人可以解释一下吗?

如何从基类访问派生类中的 typedef?

template<class Derived>
struct Test
{
    template<class T>
    typename Derived::value_type foo(T);
};

struct Derived : public Test<Derived>
{
    typedef int value_type;
};
4

2 回答 2

6

在声明的时候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;
于 2012-08-09T12:28:15.760 回答
5

您不能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;
};
于 2012-08-09T12:32:34.293 回答