2016-07-28 1 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

별칭이 잘못되어 가져 오기에 모호한 부분이 있습니다. 공개적으로 과부하되기를 원하면 별칭을 비공개로 설정하지 마십시오!

별명은 이름 충돌 오류 뱉어이 컴파일 (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(); 
} 

특수 int!

더 복잡한 경우 템플릿의 래퍼를 만들고 인수를 전달할 수도 있습니다. 여기에 간단한 별칭 오버로드가 있습니다. alias foo = a.foo;, private으로 완료하면 트릭을 수행합니다.

관련 문제