涉及CRTP和内部类型的类专业化

Ben*_*y13 2 c++ crtp template-specialization c++98

我想构建以下类.基类是定义要实现的函数,Derived实现了这个接口.

template <class T, class V>
class IBase
{
public:
    virtual void foo(const typename V::t_args&) =0;
};

template<class T>
struct T_args
{
    T z;
};

class Derived : public IBase<double, Derived>
{
public:
    typedef T_args<double> t_args;

    Derived() {}

    void foo(const t_args& x)
    { /* do some stuff */ }
};
Run Code Online (Sandbox Code Playgroud)

编译器抱怨Derived是一个不完整的类型; 我无法理解原因.这种类结构是否正确?

我被迫使用c ++ 98进行编码,但我对c ++ 11及更高版本中的任何解决方案感兴趣.

Sam*_*hik 5

在您的基本模板类中:

virtual void foo(const typename V::t_args&) =0;
Run Code Online (Sandbox Code Playgroud)

这是引用一些调用t_argsV模板参数的内部类或类型.引用类成员时,类的定义必须完整(为了弄清楚是什么t_args).您正在尝试使用此模板类,如下所示:

class Derived : public IBase<double, Derived>
Run Code Online (Sandbox Code Playgroud)

你传递的Derived是你的V,但是它的类定义是不完整的.如果模板基类仅引用其V参数,则通常为"ok".但是,您的模板要求其模板参数类型是完整的,因为它需要知道它t_args是什么,并且您的派生类在完全定义之前是不完整的.但是在完全定义其基类之前,它无法完全定义.有点像鸡与蛋的情况.

对于这种循环引用没有任何交钥匙解决方案.唯一可以做的就是重构类,所以你的"参数"类型是一个独立的类,而不是派生类.