【发布时间】:2014-06-23 04:56:57
【问题描述】:
引自 3.4.5/1(文档版本 N3797):
在类成员访问表达式 (5.2.5) 中,如果 .或 -> 令牌是 紧跟一个标识符,后跟一个 应命名一个类模板。
#include <iostream>
#include <stdio.h>
struct A { };
template <typename T> class B{ };
int main(){ A *a = new A(); a->B<int>; }
在整个后缀表达式的上下文中查找B<int> 是成功的。但是clang++返回错误:
test.cpp:14:32: error: no member named 'B' in 'A'
请解释一下那个诊断信息。
以下内容对我来说不是很清楚:如果找不到标识符,clang++ 会返回错误。但是标准说If the identifier is not found, it is then looked up in the context of the entire postfix-expression and shall name a class template。
在对象表达式类范围内找不到标识符后查找有什么意义?
【问题讨论】:
-
解释什么?除了它所说的之外,该诊断是否还有其他可能的解释?
-
@Praetorian 我已经更新了我的问题。
-
我更喜欢新的。
-
确实好多了,我不知道整个后缀表达式的上下文是什么意思。
-
我不确定它是否仅适用于从属名称。我什至怀疑这是规则的初衷。但它似乎适用于这种情况。正如我所说,也许对 CWG1111 的讨论可以对标准中的这一段有所了解。
标签: c++ class templates language-lawyer