2012-06-10 8 views
6

Perché non riesco a sovraccaricare questa funzione modello?Dov'è il conflitto qui?

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

Per quanto posso dire, le due funzioni non possono accettare gli stessi tipi di argomento.

+0

Non credo che la lingua permette di sovraccaricare * qualsiasi * funzione template .. – Mehrdad

+0

@Mehrdad: Si può sovraccaricare. In particolare, std.algorithm.find è sovraccaricato più volte. –

+0

@PeterAlexander: aspetta davvero? Ogni volta che ho provato a far funzionare una normale funzione "sovraccarico", ho ricevuto un errore .... – Mehrdad

risposta

9

Non è possibile sovraccaricare le funzioni del modello con le funzioni senza modello due to a bug. Questo dovrebbe eventualmente essere risolto in futuro.

Nel frattempo, è possibile scrivere l'altra funzione come una specializzazione modello:

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

Oh dang, dal 2007 ... – Mehrdad

+0

Sì. Al rialzo, i bug vengono risolti rapidamente http://dlang.org/bugstats.php –

+0

A volte tutto ciò che devi fare è aggiungere un set di parens vuoti, ala: double [] find() (double [] haystack, ago stringa) {ritorno pagliaio; } Non so se funzionerebbe in questo caso, ma può essere una soluzione per il bug 1528. –