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

标签 c++ inheritance namespaces

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

相关文章:

c++ - 对 `JNI_CreateJavaVM' 窗口的 undefined reference

java - Checkstyle:方法不是为扩展而设计的,但它需要

Javascript 继承和数组

c# - 我不能使用 system.windows.control 命名空间

c++ - 有没有办法让 Visual Studio 停止缩进命名空间?

c++ - 检查共享库是否与二进制文件兼容?

c++ - Cocoa-track 的菜单/将选项注入(inject) itunes

c++ - 有没有办法用父类的命名空间/类空间来引用子类?

c++ - 应该重写什么样的应用程序才能使用 OpenCL?

c# - 如何从子类向基类的字段添加属性?