1. 程式人生 > >類模板的特化,偏特化

類模板的特化,偏特化


template <typename T1, typename T2>
class MyClass {
...
};

以下數種形式的偏特化都是合理的:

// 偏特化:兩個 template parameter 相同
template <typename T>
class MyClass<T,T> {
 ...
};

// 偏特化:第二個型別為 int
template <typename T>
class MyClass<T,int> {
 ...
};

// 偏特化:兩個 template parameter 均為指標型別
template <typename T1, typename T2>
class MyClass<T1*, T2*> {
 ...
};

以下例子示範,下列各式使用上述哪一個 class template:

MyClass<int,float> mif; // 使用 MyClass<T1,T2>

MyClass<float,float> mff; // 使用 MyClass<T,T>

MyClass<float,int> mfi; // 使用 MyClass<T,int>

MyClass<int*,float*> mp; // 使用 MyClass<T1*,T2*>

如果某個宣告式與兩個(或更多)偏特化版本產生同等的匹配程度,這個宣告式便被視為模稜兩可(歧義):

MyClass<int,int> m; // 錯誤:同時匹配 MyClass<T,T> 和 MyClass<T,int>

MyClass<int*,int*> m; // 錯誤:同時匹配 MyClass<T,T> 和 MyClass<T1*,T2*>

為解除上述第二宣告的歧義性,你可以針對「指向相同型別」的指標,提供另㆒個偏特化版本:

template <typename T>
class MyClass<T*,T*> {
 ...
};