gpt4 book ai didi

C++ 复制构造函数中的命名空间冲突

转载 作者:行者123 更新时间:2023-12-02 08:34:35 25 4
gpt4 key购买 nike

我有以下代码:

namespace A {
struct Foo {
int a;
};
}

struct Foo {
int b;
};

struct Bar : public A::Foo {
Bar(Foo foo) {
c = foo.b;
}
int c;
};

C++ 编译器提示“c = foo.b”,因为 A::Foo 没有名为 b 的成员。如果我用::Foo 更改 Bar 参数的类型,它就可以工作。

我的问题是这种行为背后的合理性是什么(我想这与继承使 Bar 进入 A 命名空间这一事实有关,但我找不到任何文档来支持这一理论。

最佳答案

每个类都将其名称作为成员注入(inject)其中。所以你可以命名为A::Foo::Foo。这称为注入(inject)的类名。

[class]

2 A class-name is inserted into the scope in which it is declared immediately after the class-name is seen. The class-name is also inserted into the scope of the class itself; this is known as the injected-class-name. For purposes of access checking, the injected-class-name is treated as if it were a public member name.

[basic.lookup]

3 The injected-class-name of a class is also considered to be a member of that class for the purposes of name hiding and lookup.

由于参数类型的非限定名称查找是在类 Bar 的范围内开始的,因此它将继续进入其基类的范围以解释那里的任何成员。它会找到 A::Foo::Foo 作为类型名称。

如果您想使用全局类型名称,只需通过其周围的(全局)命名空间对其进行限定即可。

Bar(::Foo foo) {
c = foo.b;
}

这是在注入(inject)的类名不出现的范围内进行完全限定的查找。

有关后续“为什么”问题,请参阅

关于C++ 复制构造函数中的命名空间冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59092584/

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