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

Насколько я могу судить, обе функции не могут принимать одни и те же типы аргументов.

+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, струнная игла) {return haystack; } Не уверен, что это сработает в этом случае, но это может быть обходным путем для ошибки 1528. –

Смежные вопросы