限定子としてのtemplate

プログラミング言語C++』
 C.13.6 限定子としてのtemplate


メンバ関数テンプレートにおいて、引数から型を推論できない場合template限定子を使うことになる

だが、template限定子を使うようなことは稀だろう


struct hoge {
    template 
    T* get()
    {
        return 0;
    }

    template 
    void set(T*) {}
};

int main()
{
    hoge h;
    int* p1 = h.get();          // 構文エラー:より小さい演算子のうしろにint
    int* p2 = h.template get(); // OK

    // こっちは引数で型推論できるからOK
    h.set(p1);

    return 0;
}

class hoge {
public:
    template <class T>
    T* get() { return 0; }

    template <class T>
    void set(T*) {}
};

template <class Hoge>
void foo(Hoge h)
{
    int *p1 = h.get<int>();          // 構文エラー:より小さい演算子のうしろにint
    int *p2 = h.template get<int>(); // OK

    // こっちは引数で型推論できるからOK
    h.set(p1);
}

int main()
{
    hoge h;
    foo(h);

    return 0;
}


Visual C++だとtemplate限定子を付けなくてもエラーにならないが
GCCではエラーになるらしい(未確認)



参考
typenameやtemplateの許される場所