c++ - C++ 命名空间向前声明和嵌套命名空间的可见性

  显示原文与译文双语对照的内容
118 2

这是一个非常基本的问题,但我实际上从来没有定义过自己的命名空间。我正在尝试将我的qt库中的类分组到不同的命名空间( 而且还允许在没有 NAME 冲突的情况下更容易扩展) 中。例如主类( 它也代表了图书馆) 属于顶级命名空间 lib:

namespace lib {
 class LibClass;
}

这里 LibClass 使用它的他一些名称空间和类,它的中包含在 LibClass 标头中的它的他头文件中:

#include <QObject>
#include"libclass_global.h"
#include"Manager.h"
#include"Configurator.h"
namespace lib {
 class LibClass;
}
class LIBCLASSSHARED_EXPORT LibClass : public QObject {
 public:
 LibClass();
. . .
 signals:
. . .
 private slots:
. . .
 public slots:
. . .
 private:
 lib::core::communication::Manager manager;//PROBLEM HERE
 lib::core::communication::Configurator configurator;//PROBLEM HERE
}

包含 Manager.h

namespace lib {
 namespace core {
 namespace communication {
 class Manager;
 }
 }
}
class Manager {
 public:
 Manager();
. . .
 private:
. . .
}

Configurator.h

namespace lib {
 namespace core {
 namespace communication {
 class Configurator;
 }
 }
}
class Configurator {
 public:
 Configurator();
. . .
 private:
. . .
}

这些类的内容在这里并不重要。

在编译时,我得到名称空间 q3dtp 中的core 不是一个类型的NAME 。所以基本上,我需要在 LibClass的头部使用前进声明,因为插入了包含那些( 因为某些原因)的头文件:

namespace lib {
 class LibClass;
 namespace core {
 namespace communication {
 class Manager;
 class Configurator;
 }
 }
}

现在的问题是,现在我只限于指针,因为我正向前声明 ManagerConfigurator我想避免在可以能的( 不需要) 中动态分配内容。

所以问题是我如何解决这个问题?显然,我可以将所有类声明移到同一个头文件中,并将它们的定义移到相同的源文件。然而,这将使未来维护变得相当困难。只声明does命名空间似乎无法解决这个问题:我知道这两个类并没有 NAME的成员名。<name_of_class_from_nested_namespace>

时间:原作者:0个回答

91 2

你对 LibClass的声明错误。应当:

namespace lib {
 class LibClass;
}
class lib::LibClass {
. . .
};

或者

namespace lib {
 class LibClass {
. . ..
 };
}

因为它目前是在声明 lib::LibClass 并定义 ::LibClass ( 两个完全不同的类) 。

这也适用于所有其他类。

原作者:
...