gpt4 book ai didi

c++ - 具有与另一个类同名的类静态方法

转载 作者:搜寻专家 更新时间:2023-10-30 23:49:32 24 4
gpt4 key购买 nike

例子如下:

struct A
{
A(const int a ):b(a)
{
}

int b;
};

struct B
{
B() : a(5)
{
}

static void A()
{
}

A a;
};

int main()
{
B::A();
}

编译器错误是:

a9.cpp:19: error: ‘A’ does not name a type
a9.cpp: In constructor ‘B::B()’:
a9.cpp:24: error: class ‘B’ does not have any field named ‘a’

我在 fedora 9 上使用 gcc 4.3.0。

有人可以解释为什么编译器会提示吗?如果可能,引用标准。

谢谢

最佳答案

这个有效:

struct B {
B() : a(5) { }

static void A() { }

::A a;
};

因为您在 B 中使用了 A 作为成员名称,所以该成员的定义隐藏了外部命名空间中的 A 类型。使用 :: 您可以访问该命名空间。

此行为在 (draft) standard 中指定作为:

3.3.7 (1)“可以通过嵌套声明区域中同名的显式声明来隐藏名称”(struct B 的定义,它嵌套在还定义了 struct A 的命名空间中。

请仔细阅读第 3 章的介绍,基本概念,以进一步阐明。特别是,本节指定

3 (7)如果两个名字相同

  • 它们是由相同的字符序列组成的标识符;或
  • 它们是由同一个运算符组成的重载运算符函数的名称;或
  • 它们是用相同类型组成的用户自定义转换函数的名称。

请注意,最后一个定义不区分类型和类成员,因此名称隐藏(阴影)规则 3.3.7 (1) 适用。

关于c++ - 具有与另一个类同名的类静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4134563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com