Копаясь в стандартах C ++ 03 и C ++ 11, ваш код выглядит не очень корректным и корректным.C ++ 03, по-видимому, допустил это, в то время как изменение в формулировке стандарта C ++ 11, похоже, запретило это.
§7.3.3 [namespace.udecl] (Both standards)
p12 (C++ 03) Когда using-объявление переносит имена из базового класса в область производного класса, функции-члены в производном классе переопределяют и / или скрывают функции-члены с одинаковыми именами и типами параметров в базекласс (а не конфликтующие).
Обратите внимание, что в этой формулировке не упоминаются шаблоны функций-членов.
p15 (C ++ 11) Когда using-объявление переносит имена из базового класса в область производного класса, функции-члены и шаблоны функций-членов в производном классе переопределяют и / или скрывают функции-члены и шаблоны функций-членов с одинаковыми именами, параметр-тип-список (8.3.5), cv-qualification и ref-qualifier (если есть) в базовом классе (а не конфликтующий).
Обратите внимание на упоминание шаблонов функций-членов вновыйформулировка.Также обратите внимание, что в списке, который определяет, переопределяет / скрывает ли член производного класса элемент базового класса, не упоминается template-parameter-list шаблона функции-члена в качестве идентифицирующей точки, он игнорируетсядля этой цели.
Я мог бы истолковать это совершенно неправильно, но кажется, что Clang является соответствующим компилятором, а GCC, а также MSVC10 не соответствуют этой новой формулировке.