2015-03-31 11 views
5

ho qualche funzione C++ che assomiglia segue:funzione di passaggio come argomento con il valore di modello di ritorno

template<class T> bool function(QString *text, T number, T (*f)(QString, bool)){ 
    bool ok = true; 
    QString c = "hello"; 
    T col = (*f)(c, &ok); 
    // do something with col here ... 
    return true; 
} 

sto chiamando da fuori nel modo seguente

double num = 0.45; 
double (*fn)(QString, bool) = &doubleFromString; 
function(&text, num, fn); 

e (Edited)

unsigned int num = 5; 
int (*fn)(QString, bool) = &intFromString; 
function(&text, num, fn); 

E ottengo l'errore

template parameter T is ambigious 

Immagino che il problema sia nel combinare template e passare la funzione come argomento, ma non sono sicuro di come capirlo. (Non voglio scrivere la funzione due volte solo con tipi diversi). Qualche soluzione?

+1

ho sostituito 'QString' con' std :: string', che non dovrebbe fare la differenza, e io [non posso riprodurre] (http://coliru.stacked-crooked.com/a/f18cb5b956581425) it. – chris

+0

Non riesco a riprodurre questo, ma è possibile sovrascrivere la deduzione degli argomenti del template chiamando 'function (& text, num, fn)' –

+0

Nel tuo esempio (modificato), l'argomento 'number' è un' unsigned int', mentre il tuo puntatore a funzione restituisce 'int'. Quelli non sono gli stessi tipi, quindi l'errore del compilatore. –

risposta

1

Il messaggio di errore indica che l'argomento modello per T viene dedotto in modo incoerente, ovvero il tipo restituito di fn e il tipo di num differiscono nel secondo snippet di codice.

questo può essere risolto in diversi modi, di cui il seguente uno è forse la più semplice:

template<class T, class R> 
bool function(QString *text, T number, R (*f)(QString, bool)) { 
    // [..] 
    T col = f(c, &ok); // Cast if necessary. Dereferencing is superfluous, btw. 
    // [..] 
    return true; 
} 

O, ancora più semplice di quello,

template<class T, class F> 
bool function(QString *text, T number, F f) { 
    bool ok = true; 
    QString c = "hello"; 
    T col = f(c, &ok); 
    // [..] 
    return true; 
} 
+0

Grazie, questo è stato davvero il problema .. Ho appena dimenticato di copiare la seconda chiamata di funzione, dove è la mancata corrispondenza di tipo (int unsigned e int). Vedi le mie modifiche – TinF

Problemi correlati