== Quote from Nick Sabalausky ([email protected])'s article > "dsimcha" <[email protected]> wrote in message > news:[email protected]... > > == Quote from Nick Sabalausky ([email protected])'s article > >> Pardon my ignorance, but why is it that templated functions can't be > >> virtual? > > > > This is an unfortunate consequence of compilation model leaking out into > > language > > design. You're supposed to be able to subclass a base class even if you > > don't > > have the full source code to it. Let's say we have: > > > > class A { > > void doStuff(T)(T arg) {} > > } > > > > class B : A { > > void doStuff(T)(T arg) { > > writeln("In B."); > > } > > } > > > > And then we do: > > > > B b = new B; > > b.doStuff(1); > > > > The instantiation of B.doStuff() with an int would require that the vtable > > for A > > be updated to include doStuff!(int). This is not possible if we also > > allow base > > classes to be compiled separately from derived classes and the code that > > uses the > > derived class. > > > > The only solution I see would be to completely get rid of separate > > compilation. > > For my personal use, since most of my projects are under 10k lines and > > take a > > negligible amount of time to compile anyhow, I'd be in favor of this. > > However, > > for larger projects or projects that require things to work based only on > > interface, without access to the full source code, this is probably > > impractical. > But we already can't instantiate templates without the source anyway, so I > don't see how doing that vtable update for A would create any additional > requirements on source availability that we don't already have, regardless > of whether or not the function is virtual. Either way, the issue of "Do I > need to provide the source?" still boils down to just "Am I defining a > public template?" and is not at all dependent on "Is this going to be > externally subclassed?".
To clarify, the requirement is somewhat stronger than having the source. A, B, and all code that instantiates template methods of A or B would probably all have to be compiled as one compilation unit to get the vtable layout right.
