在 C Primer Plus 第 14 章的“部分專業化”部分:
如果沒有部分特化,第二個宣告將使用通用模板,將 T 解釋為 char * 型別。使用部分特化,它使用專用模板,將 T 解釋為 char。
部分專業化功能允許進行各種限制。例如,您可以使用以下內容:// 通用模板
模板 <class T1, class T2, class T3> class Trio{...};// 將 T3 設定為 T2 的特
化模板 <class T1, class T2> class Trio<T1, T2, T2> {...};// 特化 T3 和 T2 設定為 T1*
模板類 Trio<T1, T1*, T1*> {...};鑒于這些宣告,編譯器將做出以下選擇:
三重奏<int, short, char *> t1; // 使用通用模板
Trio<int, short> t2; // 使用 Trio<T1, T2, T2>
Trio<char, char *, char *> t3; // 使用 Trio<T1, T1*, T1*>
但是當我嘗試這個時:
template <typename T1, typename T2, typename T3>
class Base
{
public:
Base()
{
cout << "general definition" << endl;
}
};
template <typename T1, typename T2>
class Base<T1, T2, T2>
{
public:
Base()
{
cout << "T1 and T2 definition" << endl;
}
};
template <typename T1>
class Base<T1, T1, T1>
{
public:
Base()
{
cout << "T1 definition" << endl;
}
};
int main()
{
Base<int, char, double> b1;
Base<int, char, char> b2;
Base<int, char> b3;
Base<int, int, int> b4;
Base<int> b5;
return 0;
}
Base<int, char> b3我在和中遇到錯誤Base<int> b5:
wrong number of template arguments (2, should be 3)
wrong number of template arguments (1, should be 3)
我的問題是:當我們使用偏特化時,如果我們使用一個型別引數來初始化另一個,我們可以省略重復的部分嗎?
我的編譯器引數:
D:\MinGw-x64\mingw64\bin\g .exe 'c:\Users\33065\Desktop\study\C Primer Plus source code\*.cpp', '-o', 'c:\Users\33065\Desktop\study\C Primer Plus source code/main.exe', '-std=c 11', '-g', '-m64', '-Wall', '-static-libgcc', '-fexec-charset=GBK', '-D__USE_MINGW_ANSI_STDIO'
uj5u.com熱心網友回復:
部分特化將期望與基本模板要求一樣多的模板引數(“base”表示類模板的非特化宣告,而不是命名的型別Base)。解決您的問題的方法是將基本模板定義為:
template <typename T1, typename T2 = T1, typename T3 = T2>
class Base
{
public:
Base()
{
cout << "general defination" << endl;
}
};
由于特化不能有默認的模板引數,這使得基本模板將未定義的引數向下滲透到型別串列的其余部分。因此,您可以撰寫如下內容:
Base<T1> b1; // this will be Base<T1, T1, T1>
并讓每個未定義的型別等同于前一個型別。
演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/496358.html
上一篇:我正在閱讀“C 模板:完整指南”并且有些東西我不明白
下一篇:使用模板在C 中實作訪問者模式
