ちょっとばかり調べてみたけれど、以外としっかり書かれているサイトが見つからなかったので自分のメモ書きとして書いておいてみようと思います。(書いてあるサイトは結構あるとは思うんですが、見つけれませんでした・・・)
先に断っておくと、この記事で書くのはtemplateの一般的な使い方ではなくて、templateキーワードをつけなければならない場合(テンプレート仮引数に依存する後置式など)や、templateキーワードが禁止される場合などについてを記述しています。
まあ、JISX3014の14.2節に書かれているのでそのあたりを眺めれば分かることなんですが・・・
・templateキーワードが必要な場合
"."、"->"、また"::"修飾で明示的にテンプレート仮引数に依存するメンバテンプレートにアクセスする場合、templateキーワードをつける必要があります。
class SampleA { public: template <class T> SampleA funcA() { … } template <class T> static SampleA funcB() { … } }; template <class T> sampleFunc(T a, T* b) { a.funcA<int>(); /* エラーとなる */ a.template funcA<int>(); /* OK */ b->funcA<int>(); /* エラーとなる */ b->template funcA<int>() /* OK */ T::funcB<int>(); /* エラーとなる */ T::template funcB(); /* OK */ }
・templateキーワードが必要でない場合
templateキーワードがメンバテンプレート名の前についている場合は、templateキーワードは書く必要はありません。(つまり、"."、"->"の左辺の式、"::"の入れ子名前指定子がテンプレート仮引数に従属していない場合。)
例.
template <class T> class SampleB { public: template <class U> class SampleBase; }; template <class T> class X : SampleB<int>::SampleBase<T>; /* OK */ { … }; template <class T> class Y : SampleB<int>::template SampleBase<T>; /* これもOK */ { … };
・templateキーワードが禁止される場合
templateキーワードはテンプレートの外では書くことができません。明示的に特殊化されたテンプレートでも同じように書くことができません。
明日からネット環境のない実家に帰省するので、下宿に戻る1/3くらいまではブログの更新が止まると思います。
本当は別の記事に書くべきところだとは思いますが、今年お世話になった方々、このブログを見てくださった方々にこの場を借りてお礼を言わせていただきます。
みなさんの来年がよい年であるように願っています。
そしてまだまだ様々な面で勉強することの多い身ですが、来年もよろしくお願いします。