2016-06-07 5 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); 
} 

I은 ​​D2 및 I2 기대 된 것은 제 푸()을 제함으로써, D3 및 I3로 반환하는 단계; 대신 main()의 각 호출에서 C2780 및 C2783 오류가 발생합니다. 내가 뭘 놓치고 있니?

+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