template限定子
C++テンプレートテクニック 2-6
template<class T> int foo(T x,int n) { return x.get<3>(n); }
上記のようなテンプレートの場合、「x.get<3>(n)」は変数xのgetメンバ関数の呼び出しを期待しているわけなのだが、変数xのgetメンバ変数と3を比較するという処理、つまり「x.get < 3」と解釈される可能性がある。
#include <iostream> using std::cout; using std::endl; template<class T> int foo(T x,int n) { return x.get<3>(n); } struct X { int get; }; int main () { X x; foo(x,1); }
上記ようにstruct Xをfooに渡したとしても、コンパイルエラーにならない。
これを回避するためにはtemplate限定子を使用する。
template<class T> int foo(T x,int n) { return x.template get<3>(n); }
$ cl /W4 /EHsc main.cpp Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. main.cpp main.cpp(6) : error C2059: 構文エラー : 'template' main.cpp(15) : コンパイルされたクラスの テンプレート のインスタンス化 'int foo<X>(T,int)' の参照を確認してください with [ T=X ]
かなり特殊なケースだとは思うけど、こういうこともあるという話。