3

以下一段 C++ 代码:

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

使用 IBM 的 xlC 11.1 编译时会导致错误消息:1540-0063 (S) 文本 "operator" is unexpected。如果我使用函数而不是运算符,它可以正常工作,但我不想重写很多库代码。还有其他方法可以使.template operator构造与 xlC 一起使用吗?

4

1 回答 1

3

.template operator构造工作的最佳方式是向 IBM 提交错误报告。

此代码符合 C++ 标准。事实上,这是编写此代码的唯一合法方式。


当您提交报告时,您可以使用以下内容作为证据:

§14.2/4状态:

当成员模板专业化的名称出现在 . 或 -> 在后缀表达式中...并且后缀表达式的对象表达式类型相关的...成员模板名称必须以关键字模板为前缀。...


第一部分:“ the name of a member template specialization”,因为operator()<int>是成员模板特化的名称,所以适用。有证据表明§14.2/1

模板特化可以由template-id引用:

§14.2/1然后为匹配的模板 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是模板参数)。


这只是确定答案的一半,因为我没有为我提出的许多主张提供参考。不过,我已经在这里待了一个小时,所以可能是时候停下来了。

于 2011-10-06T14:47:02.867 回答