这是一个非常基本的问题,但实际上我从未定义过名称空间.我正在尝试将基于Qt的库中的类分组到各种名称空间中(并且还允许更容易的扩展而不会出现名称冲突).例如,主类(也代表库)属于顶级命名空间lib:
namespace lib {
class LibClass;
}
Run Code Online (Sandbox Code Playgroud)
这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
}
Run Code Online (Sandbox Code Playgroud)
与Manager.h含
namespace lib {
namespace core {
namespace communication {
class Manager;
}
}
}
class Manager {
public:
Manager();
...
private:
...
}
Run Code Online (Sandbox Code Playgroud)
和Configurator.h包含
namespace lib {
namespace core {
namespace communication {
class Configurator;
}
}
}
class Configurator {
public:
Configurator();
...
private:
...
}
Run Code Online (Sandbox Code Playgroud)
这里的课程内容并不重要.
在编译时,我得到core名称空间q3dtp中没有命名类型.所以基本上从我的理解,我需要在我的LibClass自命名空间的标题中使用前向声明似乎实际上不包含插入包含那些(由于某种原因)的头文件:
namespace lib {
class LibClass;
namespace core {
namespace communication {
class Manager;
class Configurator;
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,现在我只限于指针,因为我正在向前宣布Manager和Configurator.我想尽可能避免动态分配东西(而不是需要).
所以这里的问题是如何解决这个问题?我显然可以将所有类声明移动到相同的标头及其定义到同一源文件.然而,这将使得将来很难维护.只声明子命名空间似乎也没有解决问题 - 我得到两个类都没有命名类型,LibClass而且没有成员名称<name_of_class_from_nested_namespace>.
你的声明LibClass是错误的.它应该是:
namespace lib {
class LibClass;
}
class lib::LibClass {
...
};
Run Code Online (Sandbox Code Playgroud)
要么
namespace lib {
class LibClass {
....
};
}
Run Code Online (Sandbox Code Playgroud)
就目前而言,您正在声明lib::LibClass和定义::LibClass(两个完全不同的类).
这也适用于所有其他类.
| 归档时间: |
|
| 查看次数: |
1834 次 |
| 最近记录: |