2016-07-28 3 views
1
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(); 
} 

Special Intの代わりにintが印刷されます。異なるモジュール間でテンプレートを特殊化することは可能ですか?異なるモジュール間でテンプレートを特化するにはどうすればよいですか?

D template specialization in different source fileへの回答は、今日でもまだ関係がありますか?

答えて

1

エイリアスが間違っていて、インポートであいまいさが発生します。あなたがそれを公に過負荷にしたいならば、エイリアスをプライベートにしないでください!

エイリアスは、これは名前の競合エラーを吐き出すだろうコンパイルし、(ところでデフォルト)公開されたら:

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(); 
} 

特別int!

さらに複雑なケースでは、テンプレートのラッパーを作成して引数を転送することもできますが、単純なエイリアスオーバーロードはalias foo = a.foo;で完了したときにはprivateとなります。

関連する問題