2012-06-10 3 views
6

왜이 템플릿 기능을 오버로드 할 수 없습니까?여기서 충돌이 어디 있습니까?

import std.stdio; 

T[] find(T, E)(T[] haystack, E needle) 
    if (is(typeof(haystack[0] != needle))) 
{ 
    while(haystack.length > 0 && haystack[0] != needle) { 
     haystack = haystack[1 .. $]; 
    } 
    return haystack; 
} 

// main.d(14): Error: function main.find conflicts with template main.find(T,E) if (is(typeof(haystack[0] != needle))) at main.d(5) 
double[] find(double[] haystack, string needle) { return haystack; } 

int main(string[] argv) 
{ 
    double[] a = [1,2.0,3]; 
    writeln(find(a, 2.0)); 
    writeln(find(a, "2")); 
    return 0; 
} 

내가 알 수있는 한, 두 함수는 동일한 인수 유형을 사용할 수 없습니다.

+0

나는 언어가 * 어떤 * 템플릿 함수 .. – Mehrdad

+0

@Mehrdad 과부하 수 있습니다 생각하지 않는다 : 당신은 오버로드 할 수있는 한편

, 당신은 템플릿 특수화와 같은 다른 기능을 쓸 수 있습니다. 특히 std.algorithm.find는 여러 번 오버로드됩니다. –

+0

@PeterAlexander : 잠깐만 요? 매번 템플릿 함수를 오버로드하려고 할 때마다 오류가 발생했습니다. – Mehrdad

답변

9

템플릿 기능이 아닌 템플릿 함수로 오버로드 할 수 없습니다. due to a bug. 이것은 앞으로 언젠가는 고쳐질 것입니다.

T find(T : double[], E : string)(T haystack, E needle) 
{ 
    return haystack; 
} 
+2

Oh dang, 2007 년 이후 ... – Mehrdad

+0

예. 위쪽에서 버그는 빠르게 해결되고 있습니다. http://dlang.org/bugstats.php –

+0

때때로 빈 괄호 세트를 추가하면됩니다. double [] find() (double [] haystack, 문자열 바늘) {return haystack; } 이 경우 제대로 작동하는지 확신 할 수 없지만 버그 1528의 해결 방법이 될 수 있습니다. –