我刚开始学习C ++,正在网上查看关于模板的教程。
我正在看的例子:
// class templates
#include <iostream>
using namespace std;
template <class T>
class mypair {
T a, b;
public:
mypair (T first, T second)
{a=first; b=second;}
T getmax ();
};
template <class T>
T mypair<T>::getmax ()
{
T retval;
retval = a>b? a : b;
return retval;
}
int main () {
mypair <int> myobject (100, 75);
cout << myobject.getmax();
return 0;
}
我未完全理解的是getmax()
的标题:
template <class T>
T mypair<T>::getmax ()
几个问题:
是否可以在成员函数定义中包含比模板类中更少或更多的模板参数?那么,如果mypair
实际上是class T
和class U
,那么当您定义getmax
时,是否可以仅将class T
作为模板参数传递?< / p>
如果情况并非如此,那么拥有class T
和mypair<T>
是多余的吗?既然你不能有不同的模板参数呢?
很抱歉,如果这还不完全清楚。 谢谢!
答案 0 :(得分:1)
当您声明模板类mypair
时,您实际上声明三个相当独立的模板:mypair
的类模板,mypair::mypar
的函数模板构造函数和mypair::getmax
成员函数的函数模板。当然,这个模板并非完全不相关,因为getmax
是mypair
的成员,但它们仍然具有很大程度的独立性。它们是独立实例化的,可以独立专业化。
例如,您可以在不专门化mypair::getmax
的情况下明确专门化mypair
。这意味着你所谈论的内容确实没有冗余。 mypair::getmax
的定义是[公平] 独立功能模板的定义。该函数模板的“基本”定义必须与类模板共享其模板参数的数量和类型(因此“少或多”问题的答案为“否”),但它们仍属于模板参数功能模板。
但是,您根本不需要提供mypair::getmax
的“基本”定义。你已经在课堂上宣布了它,所以如果你愿意,你可以完全省略“基本”定义并继续立即定义专业
template<> int mypair<int>::getmax() {
// whatever
}
template<> double mypair<double>::getmax() {
// whatever
}
答案 1 :(得分:0)
是的,在更高级的情况下,可能会有不同数量的模板参数。但是现在,就这样写吧。