2012-06-10 4 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; 
} 

私が知る限り、2つの関数は同じ引数型を受け入れることはできません。

+0

私は – Mehrdad

+0

@Mehrdad ..言語はあなたが*任意の*テンプレート関数をオーバーロードすることができますとは思わない:あなたがオーバーロードすることができます。特にstd.algorithm.findは何度もオーバーロードされます。 –

+0

@PeterAlexander:本当に待ちますか?ああ、ええ、あなたは非テンプレート関数とテンプレート関数をオーバーロードすることはできません:私は、通常の関数「過負荷」テンプレート1を作るために試みたたびに、私はエラー.... – Mehrdad

答えて

9

あなたは、非テンプレート関数due to a bugとテンプレート関数をオーバーロードすることはできません。これは将来、いつか修正されるはずです。一方

、あなたはテンプレートの特殊化として他の関数を書くことができます。

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

一顧ああ、2007年以来... – Mehrdad

+0

うん。逆に、バグが時々、あなたがしなければならないすべては空の括弧のセット、ALA追加され、急速にhttp://dlang.org/bugstats.php –

+0

解決されています。double [](見つける を)(ダブル[]干し草の山、ストリング針){return haystack; } それがこのケースで動作しますが、それはバグ1528の回避策可能かどうかわかりません。 –

関連する問題