【发布时间】:2014-10-25 10:14:07
【问题描述】:
我试图理解为什么我们不能通过类成员访问表达式使用嵌套类型。 例如,我们有以下类:
struct U
{
struct A
{
static int v;
int a;
};
struct B
{
int b;
};
};
U a;
typedef a.A T; //'a' does not name a type
int main()
{
std::cout << typeid(a.A).hash_code(); //invalid use of 'struct U::A'
struct a.A b; //trying to declare a variable of type U::A
//error: expected unqualified-id before '.' token
a.A b; //the same as above
//error: expected unqualified-id before '.' token
a.A.v = 5; //error: expected unqualified-id before '.' token
}
标准说:
部分N3797::5.2.5/2 [expr.ref]
对于第一个选项(点),第一个表达式应完整 类类型。对于第二个选项(箭头),第一个表达式应 有指向完整类类型的指针。表达式 E1->E2 是 转换为等价形式 (*(E1)).E2; 5.2.5 的剩余部分 将只处理第一个选项(点)。在任何一种情况下, id-expression 应命名该类或其基类之一的成员。
而N3797::9.2/1 [class.mem] 部分给出了类成员的定义:
类的成员是数据成员、成员函数 (9.3)、嵌套 类型和枚举数。
所以我看不到这种使用嵌套类型的限制。为什么不呢?
【问题讨论】: