Конструкция оператора obj.template () не работает с xlC 11.1 - PullRequest
3 голосов
/ 06 октября 2011

Следующий фрагмент кода C ++:

template <typename T>
static void execute(T& obj) {
    obj.template operator()<int>();
}

при компиляции с IBM XLC 11.1 приводит к сообщению об ошибке: 1540-0063 (S) Текст «оператор» является неожиданным . Если я использую функцию вместо оператора, она работает нормально, но я не хочу переписывать много библиотечного кода. Есть ли другой способ заставить конструкцию .template operator работать с xlC?

1 Ответ

3 голосов
/ 06 октября 2011

Лучший способ заставить работать конструкцию .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 является параметром шаблона).


Это только половина окончательного ответа, так как я не привел ссылки на многие сделанные мной заявления. Я занимаюсь этим уже час, поэтому, наверное, пора остановиться.

...