2016-06-07 7 views
0

Я изучаю, как использовать шаблоны в сочетании с перегрузкой функции, но я не могу ее понять; в частности, у меня есть 2 функции с тем же именем, один принимает 2 параметра int, другие 3 параметра int. Мне нужно, чтобы они возвращали соответственно двойной/тройной указатель на тип, который должен быть определен вызывающим функцией; другими словами:C++ перегруженная функция и шаблоны

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

Я ожидал, что d2 и i2 должны быть возвращены по первому Foo(), d3 и i3 на второе; вместо этого я получаю ошибки C2780 и C2783 от каждого из вызовов в main(). Что мне не хватает?

+0

Что вы ожидаете 'T' быть в этих звонках? – TartanLlama

+0

Я ожидаю, что T будет двойной для первых двух вызовов, int для других 2 – gcaglion

+1

Как вы ожидаете, что компилятор узнает об этом? Все, что компилятор может использовать, чтобы определить параметры шаблона, являются параметрами функции шаблона. –

ответ

5

Компилятор не может автоматически вывести параметр шаблона (поскольку он зависит только от типа возвращаемого значения, а не от любого из аргументов). Вы должны использовать этот код вместо:

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

(Обратите внимание, я также сделал поправку на последнюю строку: вы имели int** вместо int***)

+0

Спасибо @Smeeheey. Это работало как шарм! – gcaglion

Смежные вопросы