Когда вы говорите, что компилятор принимает этот код, а другие компиляторы этого не делают, вы имеете в виду этот фрагмент кода или создание экземпляра шаблона?
Шаблоны не компилируются, когда встречается определение,а точнее, когда они созданы.Если вы не создаете экземпляр шаблона, может случиться так, что компилятор полностью игнорирует все определение шаблона (настолько, насколько это возможно, так как он должен иметь возможность интерпретировать достаточно кода, чтобы знать, когда определение шаблона заканчивается).
Затем, на более позднем этапе, если шаблон действительно создан, и при условии, что для шаблона нет специализации, компилятор будет жаловаться.Обратите внимание, что если вы предоставляете специализацию для определенного типа, эта специализация не должна наследоваться от того же несуществующего класса.
В этом конкретном случае я склонен думать, что это связано со специальным(как в нестандартной) обработке, которую компилятор Microsoft делает с зависимыми именами.Точно так же, как вам не нужно указывать typename
перед зависимым именем внутри шаблона (например, базовый класс или создание другого шаблона с аргументом типа этого шаблона), компилятор можетучтите, что базовый класс будет определен до того, как произойдет фактическое создание экземпляра, и дождитесь этого момента, чтобы выполнить проверку.