类模板的成员函数本身也是函数模板。像任何其他函数模板一样,需要使用类模板的成员函数产生该成员的实例化。与其他函数模板不同的是,在实例化类
short s = 42;
int i = 42;
// ok: s converted to int and passed to push
qi.push(s); // instantiates Queue<int>::push(const int&)
qi.push(i); // uses Queue<int>::push(const int&)
板形参由调用该函数的对象的类型确定。例如,当调用 Queue<int> 类型对象的 push 成员时,实例化的 push 函数为
void Queue<int>::push(const int &val)
对象的模板实参能够确定成员函数模板形参,这一事实意味着,调用类模板成员函数比调用类似函数模板更灵活。
用模板形参定义的函数形参的实参允许进行常规转换:
Queue<int> qi; // instantiates class Queue<int>short s = 42;
int i = 42;
// ok: s converted to int and passed to push
qi.push(s); // instantiates Queue<int>::push(const int&)
qi.push(i); // uses Queue<int>::push(const int&)
f(s); // instantiates f(const short&)
普通的函数模板不可以进行常规转换,
但可以在传参的时候手动转换,或者显示地指示函数模板的形参类型。