Представляете, GCC не умеет компилировать вот такую элементарщину:
template<class A, int B> class ClassOne:
public ClassTwo<A, B, ClassThree<A, B>>
{
...
};
Видимо, он пытается развернуть ClassThree<A, B>, ещё не зная значения этих A и B. Вот если ClassThree можно задать для конкретных A и B, то его ещё можно уговорить, соорудив что-то типа typedef ClassThreeF2 ClassThree<float, 2> и потом подсунуть этот ClassThreeF2 в объявление ClassOne.
А вот MSC'2005 жуёт такой код за милую душу.
Придётся ради совместимости с GCC переписывать кучу кода на динамическую линковку и виртуальные функции.