2016-06-07 11 views
0

Ich lerne, wie man Schablonen in Verbindung mit Funktionsüberladung verwendet, aber ich kann nicht scheinen, es zu begreifen; Genauer gesagt, ich habe 2 Funktionen mit dem gleichen Namen, man akzeptiert 2 int-Parameter, die anderen 3 int-Parameter. Ich brauche sie, um jeweils einen Doppel-/Dreifachzeiger auf einen Typ zurückzugeben, der vom Funktionsaufrufer definiert werden sollte; Mit anderen Worten:C++ überladene Funktion und Vorlagen

template <typename T> 
T** Foo(int p0, int p1){ 
    T** ret = nullptr; 
    // ... do stuff with ret ... 
    return ret; 
} 

template <typename T> 
T*** Foo(int p0, int p1, int p2){ 
    T*** ret = nullptr; 
    // ... do stuff with ret ... 
    return ret; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    double** d2 = Foo(1, 2); 
    double*** d3 = Foo(1, 2, 3); 
    int**  i2 = Foo(1, 2); 
    int**  i3 = Foo(1, 2, 3); 
} 

I erwartete d2 und i2 durch den ersten Foo(), d3 und i3 durch den zweiten zurückgeschickt werden; Stattdessen erhalte ich Fehler C2780 und C2783 von jedem der Aufrufe in main(). Was vermisse ich?

+0

Was erwarten Sie 'T' in dieser Anrufe zu sein? – TartanLlama

+0

Ich erwarte, dass T für die ersten beiden Aufrufe doppelt ist, int für die anderen 2 – gcaglion

+1

Wie erwartet der Compiler das? Alles, was der Compiler verwenden kann, um die Template-Parameter herauszufinden, sind die Parameter für die Template-Funktion. –

Antwort

5

Der Compiler kann den Template-Parameter nicht automatisch ableiten (weil er nur vom Rückgabetyp und nicht von den Argumenten abhängig ist). Sie sollten diesen Code verwenden statt:

double** d2 = Foo<double>(1, 2); 
double*** d3 = Foo<double>(1, 2, 3); 
int**  i2 = Foo<int>(1, 2); 
int*** i3 = Foo<int>(1, 2, 3); 

(Anmerkung I auch eine Korrektur auf der letzten Zeile gemacht: Sie hatte int** statt int***)

+0

Danke @Smeeheey. Das hat wie ein Zauber funktioniert! – gcaglion