On Tuesday, 18 February 2014 at 00:31:22 UTC, ted wrote:
public interface IProvider
{
    string providedType();
    T createInstance(T)();

This will cause the linker problem because templates cannot be virtual. This is declaring a final method in the interface that is never implemented.

The reason they can't be virtual is that an interface consists of an array of function pointers. Since templates might form multiple functions based on their compile-time arguments, the compiler can't know how many slots to reserve in that array for it.


What you can do is something like this:

interface IProvider {
   // this is a final method with an implementation right here
   T createInstance(T)() {
         auto i = cast(T) createDynamicInstance(typeid(T));
if(i is null) throw new Exception("Couldn't create " ~ T.stringof);
         return i;
   }

   string providedType(); // virtual function
   Object createDynamicInstance(ClassInfo type); // virtual
}


Then in the class, implement createDynamicInstance based on the classinfo instead of the template. Your other code for add and get should continue to work.

Reply via email to