What compiler is right and for what reason?
Microsoft's compilers differ from clang and gcc in the way they handle template expansion (cf "two phase lookup").
The gcc implementation is closer to the standard.
If you want all models to have the characteristics of Model<0>
then I think I would defer the common code to a different base class, which could itself be a template of course.
e.g.
template <class Outer, int _id> class ModelImpl
{
void modelly_thing() {};
};
template <int _id> class Model
: public ModelImpl<Model<_id>, 0>
{
};