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 <>
中的斜角括號之間的語法和含義。
希望有人澄清這一點。
謝謝。
抱歉密集。我仍然困惑。我幾乎從一開始就被拋棄了。 「int *是參數T的值」是什麼意思?你能澄清一下嗎? – driftwood
當您專門化模板函數時,您將聲明具有給定的所有模板參數值的函數。當你輸入'template <> foo(int *)'時,你所說的是'T'是'int *'。 –
Brian
好的我認爲在你原來的陳述中讓我感到困惑的是,如果你專門研究A,那麼T需要和參數的類型相同,如果你'專精B,那麼參數需要是T *,而不是T.「 – driftwood