2013-07-08 9 views
6

functor argで動作するメソッドを記述します。 2番目の宣言は、クラス全体をTファンクタのテンプレートとして宣言するのを避けることを可能にしました。テンプレートクラスclassNameが1つのパラメータTのクラス内にありましたが、そのクラス内にメソッドが別のパラメータファンクタを持っていましたが、クラス全体を2つのパラメータのテンプレートとして宣言しませんでした。 それは働いたが、私はそれを完全に理解していなかった。違い各

答えて

3

第2の変形は、言語ルールによってお客様のケースで適切です。/1

と続くクラステンプレートのテンプレートパラメータを指定しなければならないクラス・テンプレート定義の外で定義されたクラステンプレートのメンバー テンプレート

n3376 14.5.2メンバーテンプレートのテンプレートパラメータ。

[例:

template<class T> struct string { 
template<class T2> int compare(const T2&); 
template<class T2> string(const string<T2>& s) { /∗ ... ∗/ } 
}; 
template<class T> template<class T2> int string<T>::compare(const T2& s) { 
} 

- 終了例]

+0

ありがとうございます。理解しています。 –

3

最初のクラス テンプレートtemplate< typename T, typename functor > class classNameの(非テンプレート)メンバ関数です。第二は、例えば、 クラステンプレートtemplate <typename T> class classNameのメンバ関数テンプレートです:

まず:

template <typename T, class Functor > 
class ClassName 
{ 
ReturnType functionName(Functor f); 
}; 

第二:

template <typename T> 
class ClassName 
{ 
template <typename Functor> 
ReturnType functionName(Functor f); 
}; 

あなたはそれを徹底的に理解していなかったと言うが、あなた のように見えます:2番目のケースでは、クラス テンプレートは1つのパラメータだけを持っていますが、インスタンス化の後でさえも (タイプ0の定義)、メンバ関数はテンプレート のままです。これは多くの異なる型でインスタンス化できます。 それは関数テンプレートなので、テンプレート引数 の控除が適用されるので、型を指定する必要はありません。 コンパイラは、 関数を呼び出すと、それ自身のためにそれを計算します。