2012-06-10 18 views
6

Dlaczego nie mogę przeciążyć tej funkcji szablonu?Gdzie jest konflikt?

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

Z tego co wiem, obie funkcje nie mogą przyjmować tych samych typów argumentów.

+0

nie sądzę język pozwala przeładowywać * * dowolny szablon funkcja .. – Mehrdad

+0

@Mehrdad: Można przeciążać. W szczególności std.algorithm.find jest przeciążany kilka razy. –

+0

@PeterAlexander: Czekaj naprawdę? Za każdym razem, gdy próbowałem wykonać normalną funkcję "przeciążenia" szablonu, dostałem błąd ... – Mehrdad

Odpowiedz

9

Nie można przeładować funkcji szablonu za pomocą funkcji innych niż szablony due to a bug. Powinno to zostać naprawione w przyszłości.

W międzyczasie można napisać inną funkcję jako specjalizacji szablonu:

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

Oh dang, od 2007 ... – Mehrdad

+0

Tak. Z drugiej strony, błędy są rozwiązywane gwałtownie http://dlang.org/bugstats.php –

+0

Czasami trzeba tylko dodać zestaw pustych parenów, ala: double [] find() (double [] haystack, string needle) {return haystack; } Nie jestem pewien, czy zadziała w tym przypadku, ale może to być obejście błędu 1528. –