2014-03-03 55 views
1

玩弄模板和專門知識試圖瞭解規則我使用了下面的代碼。如何解釋函數模板解析?

template <typename T> // A 
void foo(T); 

template <typename T> // B 
void foo(T *); 

template <> 
void foo<int *>(int *); // C 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int n=0; 
    int *p = &n; 
    foo(p); 

    return 0; 
} 

你認爲哪個版本的foo會在這裏被調用?我期待着C,但那不是什麼情況。它實際上是B.但爲什麼呢? B不是C的最佳匹配和專業化嗎?

但是,如果我改變C到

template <> 
void foo<>(int *) // C 

template <> 
void foo<int>(int *) // C 

然後把foo()調用得到解決到C?因此,我不完全理解void foo <>中的斜角括號之間的語法和含義。

希望有人澄清這一點。

謝謝。

回答

1

C不是B的專門化。C中的尖括號之間的實體int*是模板參數T的值。如果你專門研究A,那麼T需要和參數的類型一樣。如果您專門研究B,則參數需要爲T*,而不是T

當您更改C的聲明

template <> 
void foo<int>(int *) // C 

C爲B的專業化,但不是A,通過同樣的道理。

在這兩種情況下,B都勝過超負荷分辨率。在第一種情況下,B沒有明確的專門化,所以B被調用。在第二種情況下,C的顯式特化被調用。

+0

抱歉密集。我仍然困惑。我幾乎從一開始就被拋棄了。 「int *是參數T的值」是什麼意思?你能澄清一下嗎? – driftwood

+0

當您專門化模板函數時,您將聲明具有給定的所有模板參數值的函數。當你輸入'template <> foo (int *)'時,你所說的是'T'是'int *'。 – Brian

+0

好的我認爲在你原來的陳述中讓我感到困惑的是,如果你專門研究A,那麼T需要和參數的類型相同,如果你'專精B,那麼參數需要是T *,而不是T.「 – driftwood