module a;
void foo(T)(){
import std.stdio;
writeln(T.stringof);
}
module b;
import a;
private alias foo = a.foo;
void foo(T: int)(){
import std.stdio;
writeln("Special int");
}
//app.d
void main()
{
import a;
import b;
foo!int();
}
这会打印int
而不是Special Int
。是否可以跨不同模块专门化模板?
我可以假设D template specialization in different source file的答案今天仍然有用吗?
答案 0 :(得分:1)
你的别名错了,你的导入引入了歧义。如果您希望公开过载,请不要将别名设为私有!
一旦别名被公开(默认btw),编译它会吐出名称冲突错误:
iii.d(6): Error: a.foo(T)() at ii.d(2) conflicts with b.foo at i.d
然后,这是一个简单的消除歧义(指定b.foo!int()
),或者更好的是从使用点删除不必要的import a
。
//app.d
void main()
{
import b;
foo!int();
}
Special int!
对于更复杂的情况,你也可以为模板创建一个包装器并转发你的参数,但是这里简单的别名重载 - 当用alias foo = a.foo;
完成时,没有private
,就可以了。