以下代码不能在 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/