2014-01-21 86 views
8

我寫的混亂,短暫的例子,我在這裏:試圖瞭解模板

#include <iostream> 

template <typename T> 
T Add (T t1, T t2) 
{ 
    std::cout << "<typename T>" << std::endl ; 
    return t1 + t2 ; 
} 

template <int> 
int Add (int n1, int n2) 
{ 
    std::cout << "<int>" << std::endl ; 
    return n1 + n2 ; 
} 

template <> 
int Add (int n1, int n2) 
{ 
    std::cout << "<>" << std::endl ; 
    return n1 + n2 ; 
} 

int main (void) 
{ 
    Add (5, 4) ; 
    Add <int> (5, 4) ; 
    Add <> (5, 4) ; 

    return 0 ; 
} 

的這個輸出是:

<> 
<> 
<> 

所以我想,好吧,最明確的專業化優先。
但後來我刪除:

template <> 
int Add (int n1, int n2) 
{ 
    std::cout << "<>" << std::endl ; 
    return n1 + n2 ; 
} 

,輸出是:

<typename T> 
<typename T> 
<typename T> 

爲什麼不template <int>版本被調用?
什麼會導致它被調用?
爲什麼這個語法的目的是?

+2

好問題。如果你想要調用'int',那麼使用'template '而不是'template ' – 2014-01-21 19:59:10

回答

7

第二次重載需要一個整數,而不是一個類型。你會先

Add<42>(1, 2); 

Live example

稱之爲澄清:第二個叫Add一個獨立重載函數,而不是專業化。你可能正在考慮類似於:

template <> 
int Add<int>(int n1, int n2) 
{ 
    std::cout << "<T=int>" << std::endl ; 
    return n1 + n2 ; 
} 

這與您寫的最後一個專業化程序完全相同,因此會與它發生衝突(重新定義它)。 Live example

+0

這個答案缺少解決方案,它會很完美(解決方案在另一個答案中你知道) – 2014-01-21 20:02:41

+0

@ user9000我不能輸入那麼快,我想包括與OP玩的實例:)(當然更新的答案) –

+1

這回答了「什麼會導致它被調用?」的問題和'爲什麼不調用模板?',但OP提出的另一個問題仍然沒有答案。我真的很好奇,除了向模板對象提供編譯時參數以外,其目的是什麼 – smac89

4

您對int s使用錯誤的專業化語法。它應該是:

template <> 
int Add<int>(int n1, int n2) 
{ 
    std::cout << "<int>" << std::endl ; 
    return n1 + n2 ; 
} 

如果你這樣做,你會發現它與最終專業化衝突由於多個定義。

+0

+1。放棄我的答案,並對這一個進行投票。 – WhozCraig