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つの関数は同じ引数タイプを受け入れることができません。

4

1 に答える 1

9

バグのため、テンプレート関数を非テンプレート関数でオーバーロードすることはできません。これは、将来的に修正されることを願っています。

それまでの間、他の関数をテンプレートの特殊化として記述できます。

T find(T : double[], E : string)(T haystack, E needle)
{
    return haystack;
}
于 2012-06-10T17:48:26.373 に答える