我不明白以下代码:
template <int _id> class Model;
template <int _id> class Model : public Model<0> { ... };
因此,类模型似乎从它本身派生出来。这不能用EDG或Gcc编译(错误:无效使用不完整类型'类Model&lt; 0&gt;'),但Visual Studio接受它。什么编译器是正确的,出于什么原因?
答案 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>
{
};