![](/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.