Ответ 1
Это связано с двухфазным поиском. Краткая версия заключается в том, что любые имена, которые не зависят от параметра шаблона (например, someBoolean
здесь), будут проверяться на время определения шаблона. Это означает, что компилятор Solaris правильно отклоняет код. someBoolean
не был определен до того, как будет определен шаблон.
Имена, которые зависят от параметра шаблона (например, если вы написали что-то вроде T::someBoolean = true
), будут отложены до времени создания шаблона - очень разумно, так как их достоверность не может быть определена до тех пор, пока компилятор не узнает, что T
является. Известно, что MSVC не выполняет эту двухфазную семантику должным образом (по крайней мере исторически), поэтому ваш код работает там. Это не правильно С++, а не переносимое поведение.
Раздел 14.6 (неизвестная версия) стандарта С++ (вероятно, черновик):
Если имя не зависит от параметра шаблона (как определено в 14.6.2), объявление (или набор объявлений) для этого имени должно быть в области видимости в точке, где имя отображается в определении шаблона; имя привязано к объявлению (или объявлениям), найденному в этой точке, и эта привязка не является показателем деклараций, которые видны в момент создания экземпляра.
(через комментарий @BenVoigt ниже)