一応補足をば.class templateの内部でクラス名だけを書くと
実体化された型を指すことになります.

template<typename T>
class C{
// ここで`C'と書けば実体化されたCの型を表します.
// T = intで実体化されたなら,C<int>と同義になります.
};

問題は53さんのようにtemplate template引数を引き渡したいときで,
この場合,class内部から::を使って大域のクラス名を指すことによって解決できます.
ところがここにもう一つワナがあって<:がダイグラフとして認識されてしまう
([と同じになる)ので,<と::の間にスペースが必要となり,
結果58の書き方になります.
GCCとVCのコンパイラの反応の違いは,恐らくsuper classの指定の部分を
クラスの内部と見るか外部と見るかの実装の相違から来ているものと邪推します.