К сожалению, как сказал @Mat в комментариях, единственная жизнеспособная альтернатива здесь - это исправить код (и вы показали, что уже знаете, как это сделать).
Это результат двухфазного поиска имени, поэтому, чтобы компилятор принял его, вам нужен тот, который не реализует двухфазный поиск имени. С компилятором Microsoft вы можете использовать флаг - Zc:twoPhase-
, чтобы получить старое поведение с текущим компилятором (то есть, чтобы компилятор принял ваш код как есть).
g ++ имел двухфазный поиск имен, достаточно корректный, начиная с g ++ 4.7, если память не изменяет. Я был бы довольно уверен, что все серии g ++ 3.x по-прежнему будут принимать ваш код, и, вероятно, ранняя версия g ++ 4.x также будет, но я уверен, что g ++ 4.7 и более поздние отклонят его.
Что касается Clang - если память служит, у нее был двухфазный поиск имени с самого начала. Ранние версии, несомненно, имели некоторые ошибки, поэтому вряд ли кто-то из них мог бы это допустить, но я в чем-то сомневаюсь - это в значительной степени классическая демонстрация того, когда поиск по двухфазному имени нарушает существующий код, поэтому любой компилятор, который пытается Реализация поиска по двухфазному имени почти наверняка имеет тестовый пример, подобный этому.