CRTP 在 derived class from base class 中引用 typedef

CRTP refer to typedef in derived class from base class

我有以下代码:

template <typename T>
class A
{
    typedef typename T::Type MyType;
};

template <typename T>
class B : public A<B<T>>
{
    typedef T Type;
};

当我尝试实例化 B 时,我使用 MSVS 2015 收到以下错误消息:

'Type': is not a member of 'B<int>'

这段代码是有效的 C++ 还是 MSVS 正确?

问题就出在这里

template <typename T>
class A
{
    typedef typename T::Type MyType;
                     ^^^
};

T 需要是一个完整的类型。但在你的情况下,当 A<T> 在这里实例化时:

template <typename T>
class B : public A<B<T>>
                 ^^^^^^^

B<T>还不是一个完整的类型!所以不幸的是这不能工作。

简单的解决方法就是单独传入Type

template <typename T, typename Type>
class A
{
    typedef Type MyType;
};    

template <typename T>
class B : public A<B<T>, T>
{

};