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及更高版本中的任何解决方案感兴趣.
在您的基本模板类中:
virtual void foo(const typename V::t_args&) =0;
Run Code Online (Sandbox Code Playgroud)
这是引用一些调用t_args其V模板参数的内部类或类型.引用类成员时,类的定义必须完整(为了弄清楚是什么t_args).您正在尝试使用此模板类,如下所示:
class Derived : public IBase<double, Derived>
Run Code Online (Sandbox Code Playgroud)
你传递的Derived是你的V,但是它的类定义是不完整的.如果模板基类仅引用其V参数,则通常为"ok".但是,您的模板要求其模板参数类型是完整的,因为它需要知道它t_args是什么,并且您的派生类在完全定义之前是不完整的.但是在完全定义其基类之前,它无法完全定义.有点像鸡与蛋的情况.
对于这种循环引用没有任何交钥匙解决方案.唯一可以做的就是重构类,所以你的"参数"类型是一个独立的类,而不是派生类.
| 归档时间: |
|
| 查看次数: |
51 次 |
| 最近记录: |