Am 30.01.2015 um 11:39 schrieb Martin Nowak:

If you mean float, then it
will instatiate the template when compiled individually and use b's
instantiation when b and c are compiled together.

If this is true, then please explain this behavior:

module a; // --> a.dll

struct Storage(T)
{
  T var;
  __gshared T s_var;
}


module b; // --> b.dll
import a;

export __gshared Storage!int g_var1;


module c; // --> c.exe
import a;
import b;

__gshared Storage!int g_var2;

void main(string[] args)
{
  g_var1.var = 2;
  g_var2.var = 3;

  g_var1.s_var = 2;
  g_var2.s_var = 3;
}

c.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_D1a14__T7StorageTiZ7Storage5s_vari" in Funktion "_Dmain".


If your statement would be true module c should not use the instance from module b because they are not compiled together. But as you can clearly see from the linker error message module c does not instanciate the template, because if module c would instanciate the template there would not be a unresolved symbol.

Compiling module c with "-allinst" solves the problem. Putting "export" in front of struct Storage(T) also solves the problem. And thats exactly the reason why it is neccessary to be able to export templates. (Where export means, export all template instanciations)

Reply via email to