2016-07-28 2 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(); 
} 

Отпечатано int вместо Special 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(); 
} 

Special int!

Для более сложных случаев вы также можете создать оболочку для шаблона и переслать свои аргументы, но здесь просто перегрузка псевдонимов - когда это делается с alias foo = a.foo;, нет private, сделает трюк.

Смежные вопросы