Pertanyaan Melewati fungsi sebagai argumen dengan nilai kembali templat


Saya memiliki beberapa fungsi c ++ yang terlihat seperti berikut:

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

Saya menyebutnya dari luar dengan cara berikut

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

dan (Diedit)

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

Dan saya mendapatkan kesalahan

template parameter T is ambigious

Saya kira masalah itu adalah dalam menggabungkan fungsi template dan passing sebagai argumen, tetapi saya tidak yakin bagaimana cara mengetahuinya. (Saya tidak ingin menulis fungsi dua kali hanya dengan tipe berbeda). Ada solusi?


5
2018-03-31 16:13


asal


Jawaban:


Pesan kesalahan menunjukkan bahwa argumen template untuk T dideduksi secara tidak konsisten - yaitu jenis yang dikembalikan fn dan jenis num berbeda dalam cuplikan kode kedua Anda.

Ini dapat dipecahkan dengan beberapa cara, yang mana yang berikut mungkin yang paling sederhana:

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

Atau, bahkan lebih sederhana dari itu,

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

1
2018-03-31 16:19