2012-06-22 129 views
3

考慮下面的代碼:默認值特

template <class x1, class x2 = int*> 
struct CoreTemplate { }; 

template <class x1, class x2> 
struct CoreTemplate<x1*, x2*> { int spec; CoreTemplate() { spec = 1; } }; 

template <class x> 
struct CoreTemplate<x*> { int spec; CoreTemplate() { spec = 3; } }; 

int main(int argc, char* argv[]) 
{ 
    CoreTemplate<int*, int*> qq1; 
    printf("var=%d.\r\n", qq1.spec); 

    CoreTemplate<int*> qq2; 
    printf("var=%d.\r\n", qq2.spec); 
} 

MSVC編譯該代碼細,並且選擇在兩種情況下,第二個特。對我而言,這些專業化是相同的。第一手合法性如何?

只是好奇,對此有何想法?

回答

4

第二部分專業化是合法的,與第一個不完全相同。

第二部分特化沒有列出在其模板參數列表中的第二個模板參數一個參數,所以使用的int*默認參數,因此它等同於:

template <class x> 
struct CoreTemplate<x*, int*> { ... }; 

將被選中對於第一個模板參數是指針類型和第二個模板參數是int*的任何實例化。

即比第一部分特,其將被用於當第一模板參數是一個指向型和第二個模板參數更專門的是任何指針類型除了int*

在您的程序中,qq1qq2使用int*作爲第二個模板參數(顯式或使用默認參數),因此都選擇第二個實例化。

+0

感謝您的評論。合理的建議。 –