2012-06-10 42 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

哦當然,自2007年以來... – Mehrdad

+0

是的。有趣的是,錯誤正在得到迅速解決http://dlang.org/bugstats.php –

+0

有時候你只需要添加一組空副本,ala: double [] find()(double [] haystack,字符串針){返回haystack; } 不確定在這種情況下它是否能夠正常工作,但它可以是bug 1528的解決方法。 –