gpt4 book ai didi

c++和注入(inject)的基本名称

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:25 25 4
gpt4 key购买 nike

以下代码不能在 gcc 中编译:

namespace One{
class A{
};
};

namespace Two{
class A{
public:
void what(){
cout << "Two::A says what!" << endl;
}
};

class B : public One::A{
public:
B(){
A xx;
xx.what();
}
};

};

它给出:

gccbug.cpp: In constructor ‘Two::B::B()’:
gccbug.cpp:23: error: ‘class One::A’ has no member named ‘what’

现在,有人告诉我这是正确的行为(由于注入(inject)了 One::A 的基本名称,使 A 引用 One::A)。但是,此代码在 C# 中编译(好吧,在更改了一些内容之后),因此这似乎是特定于 C++ 的。

我想知道的是.. 为什么?将基本名称“One::A”注入(inject)为“A”是否有特定目的?

最佳答案

我能想到的唯一原因是,在 C++ 中,您很可能会在构造函数的初始化列表中引用基类名称,如下所示:

namespace Two {

/*...*/

class B : public One::A {
public:
B():A()
{
/*...*/
}
};
}

当然,目的与您的示例中的不同,因为您实际上在构造函数中声明了一个局部变量,而在我的示例中,A() 指的是类型的对象A 由于继承而隐含在 class B 的定义中。

但是,我的例子的情况更有可能发生,所以我猜他们认为在这种情况下我们不需要显式命名空间。因此,任何不带 namespace 的对 A 的引用都被解释为引用基类,而不是任何其他名为 A 的类,即使它在同一 namespace 中作为 B 的声明。

关于c++和注入(inject)的基本名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9452731/

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