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
        ]

かなり特殊なケースだとは思うけど、こういうこともあるという話。