C ++类模板:非内联成员函数的冗余?

时间:2012-08-16 18:39:47

标签: c++ templates

我刚开始学习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 Tclass U,那么当您定义getmax时,是否可以仅将class T作为模板参数传递?< / p>

如果情况并非如此,那么拥有class Tmypair<T>是多余的吗?既然你不能有不同的模板参数呢?

很抱歉,如果这还不完全清楚。 谢谢!

2 个答案:

答案 0 :(得分:1)

当您声明模板类mypair时,您实际上声明三个相当独立的模板:mypair的类模板,mypair::mypar的函数模板构造函数和mypair::getmax成员函数的函数模板。当然,这个模板并非完全不相关,因为getmaxmypair的成员,但它们仍然具有很大程度的独立性。它们是独立实例化的,可以独立专业化。

例如,您可以在不专门化mypair::getmax的情况下明确专门化mypair。这意味着你所谈论的内容确实没有冗余。 mypair::getmax的定义是[公平] 独立功能模板的定义。该函数模板的“基本”定义必须与类模板共享其模板参数的数量和类型(因此“少或多”问题的答案为“否”),但它们仍属于模板参数功能模板。

但是,您根本不需要提供mypair::getmax的“基本”定义。你已经在课堂上宣布了它,所以如果你愿意,你可以完全省略“基本”定义并继续立即定义专业

template<> int mypair<int>::getmax() {
  // whatever
}

template<> double mypair<double>::getmax() {
  // whatever
}

答案 1 :(得分:0)

是的,在更高级的情况下,可能会有不同数量的模板参数。但是现在,就这样写吧。