0

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

如果不是这种情况,那么拥有class Tand是多余的mypair<T>吗?既然你不能有不同的模板参数吗?

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

4

2 回答 2

1

当你声明你的模板类mypair时,你实际上是在声明三个相当独立的模板:一个用于 的类模板mypair、一个用于mypair::mypar构造函数的函数模板和一个用于mypair::getmax成员函数的函数模板。Thise 模板当然不是完全不相关的,因为getmax它是 的成员mypair,但它们仍然具有很大程度的独立性。它们是独立实例化的,它们可以独立专门化。

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

但是,您根本不需要提供“基本”定义mypair::getmax。您已经在类中声明了它,因此如果您愿意,可以完全省略“基本”定义并立即继续定义专业化

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

template<> double mypair<double>::getmax() {
  // whatever
}
于 2012-08-16T18:46:11.233 回答
0

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

于 2012-08-16T18:42:36.763 回答