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と、実際には3つのかなり独立したテンプレートが宣言されます。クラステンプレートはmypairmypair::myparコンストラクター用の関数テンプレート、およびmypair::getmaxメンバー関数用の関数テンプレートです。もちろん、このテンプレートは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 に答える