1、default template arguments can't be used in function templates
(1)template <class T=int>//错误
T fun(T m)
{
return m;
}
(2)
template <class T,int N=1>//错误
T fun(T m)
{
return m*N;
}
(3)常规参数必须显式的给出对应于常规参数的模板实参
例: template <class T,int N>
T fun(T m)
{
return m*N;
}
int main()
{
fun<int,3>(1);//int不可省
return 0;
}
例:template <int N,class T>
T fun(T m)
{
return m*N;
}
int main()
{
fun<3>(1);//int可省
return 0;
}
2、default template arguments can be used in class templates
#include <iostream>
using namespace std;
template <class T=int,int N=10>// //模板类的默认模板参数class Set
{
public:
Set(int s=N);
~Set();
int GetSize();
private:
T *data;
int size;
};
template <class T,int N>////默认模板参数的类模板成员函数类外定义方式,在定义这里就不用再声明默认模板参数类型了
Set<T,N>::Set(int s){
size=s;
data=new T[size];
}
template <class T,int N>
Set<T,N>::~Set()
{
delete [] data;
}
template <class T,int N>
int Set<T,N>::GetSize(){
return size;
}
int main()
{Set<> s;// //因为已经是默认的模板参数了,所以可以不用在实例化类的时候声明类型,但是尖括号是必须要有的
cout<<s.GetSize();
return 0;
}