使用CRTP时,在基类中使用非模板派生类的typedef

Mih*_*yan 2 c++ templates crtp

我正在使用CRT模式,并希望基类typedef从派生类中看到s.在这篇文章中 @James McNellis建议使用base_traits类来做到这一点并且它工作正常.但是在该帖子中描述的情况下,派生类本身就是一个模板.当派生类不是模板时,此方法在VS2010中不起作用.

template <class D>
struct base_traits;
template <class D>
struct base
{
    typedef typename base_traits<D>::value_t value_t;
};

struct derived : base<derived>
{
    typedef typename base_traits<derived>::value_t value_t;
};

template<>
struct base_traits<derived>
{
    typedef int value_t;
};
Run Code Online (Sandbox Code Playgroud)

上面的代码提供了很多错误.第一个是:

错误C2027:使用未定义类型'base_traits

base类的typedef 的行上.

qua*_*dev 6

base_traits<derived>必须在它的使用之前声明和定义,因为隐含的实例化base<derived>(下面,我转发声明derived)需要它:

template <class D>
struct base_traits;


template <class D>
struct base
{
    typedef typename base_traits<D>::value_t value_t;
};

struct derived;

template<>
struct base_traits<derived>
{
    typedef int value_t;
};

struct derived : base<derived>
{
    typedef base_traits<derived>::value_t value_t;
};


int main(void)
{
    derived d;
}
Run Code Online (Sandbox Code Playgroud)

现场演示