Let's look at what happens if it is allowed.
The definition of the TemplateChild class can be present in several translation units (source files). In each of these translation units, the compiler must be able to generate a virtual function table (vtable) for TemplateChild to ensure that vtable is present to use the linker.
The vtable says: "for an object whose dynamic type is TemplateChild , these are the final overrides for all virtual functions." For example, for RegularChild vtable shows two overrides of RegularChild::method(int) and RegularChild::method(float) .
Your explicit instances for TemplateChild::method will only appear in one translation unit, and the compiler only knows that they exist in one translation unit. When compiling other translation units, he does not know that explicit instances exist. This means that you will end up with two different vtables for the class:
In the translation block, where explicit instances are present, you will get a vtable that displays two overrides of TemplateChild::method<int>(int) and TemplateChild::method<float>(float) . This is normal.
But in translation units, where there are no explicit instances, you will have a vtable that maps to the virtual functions of the base class (which in your example are purely virtual, just pretend that there are definitions of the base class).
You can even have more than two different vtables, for example. if explicit instances for int and float appear in their own translation unit.
In any case, we now have several different definitions for the same thing, which is a serious problem. In the best case, the linker can choose one and discard the rest. Even if there was some way to tell the linker to choose one that has explicit instances, you still have the problem that the compiler can devirtualize virtual function calls, but for that the compiler needs to know which final overrides (in fact , he should know that in vtable).
So, there are serious problems that would arise if this were resolved, and given the C ++ compilation model, I do not think that these problems are solvable (at least not without major changes in the way C ++ is compiled).