![](/img/trans.png)
[英]C++ friend class of the same name in different levels of a nested namespace
[英]Inheritance for class with the same name but different namespace c++
是否可以从具有相同名称但在不同命名空间中的 class 继承以及如何实现?
例如我有以下结构:
namespace general {
namespace gui {
struct GUI {
};
}}
我可不可以做:
namespace proxy {
namespace gui {
struct GUI : general::gui::GUI {
};
}}
或者/应该有另一种方法来做到这一点(实际上命名 class / 结构不同)?
根据Pete 的 Becker评论进行更新。
它的当前结构方式是这样的:
gui.h
#include "world.h"
namespace general {
namespace gui {
struct GUI {
};
}}
世界.h
namespace general {
namespace world {
struct World {};
}}
代理.h
namespace proxy {
namespace gui {
struct GUI : general::gui::GUI {
};
}}
我的理解是编译器查看 world.h,没有找到 general::gui 并抱怨
proxy.h(17,30): error C2039: 'gui': is not a member of 'general'
world.h(4): message : see declaration of 'general'
如果我添加
namespace world {
struct World {};
}}
对于gui.h或其他方式,它很可能会起作用。 只是对我为什么需要这样做感到困惑。
更新 2(带有 .cpp 文件):
世界.cpp
#include "world.h"
namespace general {
namespace world {
World{
gui.cpp
#include "gui.h"
namespace general {
namespace gui {
代理.cpp
#include "proxy.h"
namespace proxy {
namespace gui {
在 .cpp 文件方面,所有这些都只是包括其相应的 header 文件。 这是一般规则。
加上这里是(相关的)header 文件链,最肯定的问题出在哪里:
goal.h includes world.h and proxy.h
gui.h includes world.h and goal.h
menu.h includes goal.h
world.h - includes nothing
proxy.h - includes nothing
是的,这是可能的。 如果您遇到错误,则说明您的代码中有一些您没有在此处发布的内容,例如 using namespace 语句。
proxy::gui::GUI
和general::gui::GUI
是两个完全不同的类。 两者都以GUI
结尾的事实根本说明不了什么。
class 的全名/全名始终是全名,包括命名空间。
这就是命名空间的意义所在。 它们的发明是为了防止不同库之间的名称冲突。 假设您有供应商“A”库,其中包括 class GUI
。 想象一下,您想在自己的代码中使用这个库,您还定义了一个 class GUI
。 如果没有命名空间,这些名称会发生冲突,您将被迫重命名自己的 class 以使用该库。
但是有了命名空间,一切都很好。 A::GUI
与yourcode::GUI
或普通GUI
不同。
所以
namespace general { namespace gui {
class GUI {};
}}
namespace proxy { namespace gui {
class GUI:public general::gui::GUI {};
}}
将/应该工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.