2012-06-10 12 views
6

Tại sao tôi không thể quá tải chức năng mẫu này?Đâu là xung đột ở đây?

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

Theo tôi có thể biết, hai hàm không thể chấp nhận cùng một loại đối số.

+0

Tôi không nghĩ rằng ngôn ngữ cho phép bạn quá tải * bất kỳ * mẫu chức năng .. – Mehrdad

+0

@Mehrdad: Bạn có thể quá tải. Cụ thể std.algorithm.find bị quá tải nhiều lần. –

+0

@PeterAlexander: Đợi thật? Mỗi lần tôi cố gắng làm cho một chức năng thường xuyên 'quá tải' một khuôn mẫu, tôi đã nhận được một lỗi .... – Mehrdad

Trả lời

9

Bạn không thể quá tải chức năng mẫu có chức năng không phải mẫu due to a bug. Điều này hy vọng sẽ được sửa chữa trong tương lai.

Trong khi đó, bạn có thể viết các chức năng khác như là một mẫu chuyên môn:

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

Oh dang, kể từ năm 2007 ... – Mehrdad

+0

Vâng. Ngược lại, các lỗi đang được giải quyết nhanh chóng http://dlang.org/bugstats.php –

+0

Đôi khi tất cả những gì bạn phải làm là thêm một tập hợp các dấu ngoặc rỗng, ala: double [] find() (double [] haystack, chuỗi kim) {return haystack; } Không chắc chắn nếu nó sẽ làm việc trong trường hợp này, nhưng nó có thể là một cách giải quyết cho lỗi 1528. –