为什么通过 CRTP 访问派生类中的 typedef 时会出现错误



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

如何从基类访问派生类中的 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还不是一个完整的类型 - 你才刚刚开始声明它!因此,在专用化Test<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或成员,因为此时它不是完整的类型。 允许这样做会导致循环行为:

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;
};

最新更新