Лучший способ заставить работать конструкцию .template operator
- это отправить отчет об ошибке в IBM.
Этот код соответствует стандарту C ++. Фактически это единственный законный способ написания этого кода.
Когда вы подаете отчет, вы можете использовать в качестве доказательства следующее:
§14.2/4
состояния:
Когда имя специалиста шаблона члена появляется после. или -> в постфиксном выражении ... и объектное выражение постфиксном выражении равно
зависит от типа ... имени шаблона элемента должен предшествовать ключевое слово template. ...
Первая часть: "the name of a member template specialization
", потому что operator()<int>
- это имя специализации шаблона участника. Есть доказательства этому в §14.2/1
:
На специализацию шаблона может ссылаться идентификатор шаблона :
§14.2/1
затем указывает синтаксис для template-id , который соответствует operator()<int>
.
Вторая часть: "and the object expression of the _postfix-expression_ is
type-dependent
", применяется, потому что obj
зависит от типа. obj
зависит от типа из-за §14.6.2.2/3
:
id-выражение зависит от типа, если оно содержит: - идентификатор , связанный с поиском имени с одним или несколькими объявлениями, объявленными с зависимым типом, ...
В этом случае obj
ассоциируется с T&
, который является зависимым типом (поскольку T
является параметром шаблона).
Это только половина окончательного ответа, так как я не привел ссылки на многие сделанные мной заявления. Я занимаюсь этим уже час, поэтому, наверное, пора остановиться.