在"部分专门化"&;c++ Primer Plus第14章第1节:
如果没有部分特化,第二个声明将使用通用模板,将T解释为char *类型。对于部分专门化,它使用专门化模板,将T解释为char。
部分专门化特性允许进行各种限制。例如,您可以使用以下命令://通用模板
模板<类T1,类T2,类T3>类三{…};
模板<类T1,类T2>类别Trio<T1,>{…};模板类Trio<T1,>{…};给定这些声明,编译器将做出以下选择:
int, short, char *>t1;//使用通用模板
Trio<int,>t2;
Trio<char,>t3;//使用Trio<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-x64mingw64bing++.exe 'c:Users33065DesktopstudyC++ Primer Plus source code*.cpp', '-o', 'c:Users33065DesktopstudyC++ Primer Plus source code/main.exe', '-std=c++11', '-g', '-m64', '-Wall', '-static-libgcc', '-fexec-charset=GBK', '-D__USE_MINGW_ANSI_STDIO'
部分专门化将期望与基模板要求的一样多的模板参数("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>
,并使每个未定义的类型等于前一个类型。
演示