類模板的特化,偏特化
阿新 • • 發佈:2019-02-18
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*> {
...
};