【问题标题】:Is it possible to use class name which declare in namespace without namespace::是否可以使用在没有命名空间的命名空间中声明的类名::
【发布时间】:2020-07-20 10:14:09
【问题描述】:

是否可以使用在没有命名空间的命名空间中声明的类名?

我试过这样:

//MyClass.h
namespace MyNamespace {
  class MyClass;
}

class MyNamespace::MyClass {
  public:
    /* ... */
}

//MyOtherClass.cpp
#include "MyClass.h"
using namespace MyNamespace;

void MyOtherClass::MyFunction() {
  MyClass *myClass = new MyClass;
}

但它不起作用。 编译器说“MyClass 不明确。”

我想这段代码会起作用:

//MyOtherClass.cpp
#include "MyClass.h"
using namespace MyNamespace;

void MyOtherClass::MyFunction() {
  MyNamespace::MyClass *myClass = new MyClass;
}

但这对我来说很不舒服。 我想使用没有“MyNamespace::”的“MyClass”。

有可能吗?

感谢您的帮助。

我得到了答案:不可能。 C++ 类有自己的默认命名空间。如果我声明MyNamespace,则有两个与MyClass 关联的命名空间。如果我使用MyClass 而不选择我想要使用的命名空间,编译器会感到模棱两可我真正想要使用的命名空间。所以它会告诉我“MyClassis ambiguous.”

【问题讨论】:

  • 编译器是否告诉您MyClass 的两个(或更多)定义在哪里它认为是模棱两可的?什么是MyOtherClass,它是如何定义的?
  • 为你的代码创建一个“工作”minimal reproducible example can't replicate your problem
  • @1201ProgramAlarm(抱歉英语不好)我把你的词“MyClass的定义”写成MyClass *myClass = new MyClass;这样的代码。如果我是对的,答案是肯定的。编译器告诉我MyClass 与使用MyClass 的每个代码都模棱两可。
  • @1201ProgramAlarm 关于你的第二个问题,我认为MyOtherClass是如何定义的并不是这个问题的关键。

标签: c++ namespaces


【解决方案1】:

如果以下代码都在同一个 .h 文件中(您并没有真正澄清)

//MyClass.h
namespace MyNamespace {
  class MyClass;
}

class MyNamespace::MyClass {
  public:
    /* ... */
}

那么您在第一部分中对 MyNamespace::MyClass 进行前向声明。 你应该在 MyClass.h 中有这样的东西

    namespace MyNamespace {
      class MyClass
      {
       public:
        // constructor, methods,...
      }; // end of class declaration
    } // end of namespace

以及 MyClass.cpp 中的相关定义

【讨论】:

  • 感谢您的帮助,但您的建议不适合这个问题。好吧,几分钟前我得到了这个问题的答案。 C++ 类有自己的默认命名空间。如果我声明MyNamespace,则有两个与MyClass 关联的命名空间。如果我使用MyClass 而不选择我想使用的命名空间,编译器会觉得我真正想使用的命名空间模棱两可。所以它会告诉我“MyClass是模棱两可的。”对不起我的英语不好,谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 2013-01-10
  • 2013-03-05
相关资源
最近更新 更多