テンプレートとして渡されたクラスのテンプレートなスタティック関数を呼び出すとき

テンプレートとして渡されたクラスのテンプレートなスタティック関数を呼び出すときに困ったのでメモ.

ハマッたコード

class A{
    public:
        template <class T>
        static void func(){
            T x;
            (略)
        }
};

template <class T1, class T2>
void test(){
    T1::func<T2>();
}

Visual Studio 2012ではコンパイルが通るっぽいけど,g++(4.8)でコンパイルすると
'>' の前に primary-expressionがない的なエラーが起きた.
困った時のclang頼み.

clang++でコンパイルをすると,今度は
func の前に template を入れろ的なエラー.

そして最終的なコードは

template <class T1, class T2>
void test(){
    T::template func<T2>();
}

となりました.
これならg++でもclang++でもコンパイルが通った!
Visual Studioでは…