一个类如何继承自己?

时间:2017-09-15 09:43:51

标签: c++ templates inheritance

我不明白以下代码:

template <int _id> class Model;

template <int _id> class Model : public Model<0> { ... };

因此,类模型似乎从它本身派生出来。这不能用EDG或Gcc编译(错误:无效使用不完整类型'类Model&lt; 0&gt;'),但Visual Studio接受它。什么编译器是正确的,出于什么原因?

2 个答案:

答案 0 :(得分:6)

  

因此,类模型似乎从它本身派生出来。

该类不继承本身Model<N>的每个实例都是一个不同的,无关的类。

  

这不能用EDG或Gcc编译(错误:无效使用不完整类型'类Model&lt; 0&gt;'),但Visual Studio接受它。什么编译器是正确的,出于什么原因?

GCC是正确的,在使用时,Model<0>不完整。继承需要一个完整的类声明。

答案 1 :(得分:1)

  

什么编译器是正确的,出于什么原因?

Microsoft的编译器在处理模板扩展方面与clang和gcc不同(参见“两阶段查找”)。

gcc实现更接近标准。

如果您希望所有模型都具有Model<0>的特征,那么我认为我会将公共代码推迟到不同的基类,当然这本身就是模板。

e.g。

template <class Outer, int _id> class ModelImpl
{
    void modelly_thing() {};
};

template <int _id> class Model 
: public ModelImpl<Model<_id>, 0> 
{

};