[英]c++ namespace with class
ns.cpp
:
#include <iostream>
namespace ns { // want to access this globally
class A ;
}
class ns::A {
public:
int x1;
char s1[128];
};
int main()
{
int doit();
//using namespace ns;
ns::A a;
a.x1= 2;
std::cout << "pre " << a.x1 << "\n" ;
doit();
std::cout << "post " << a.x1 << "\n" ;
}
ns_call.cpp
:
namespace ns {
class A;
}
class ns::A {
public:
int x1;
char s1[];
};
using namespace ns;
int
doit()
{
extern ns::A a;
a.x1= 100;
}
在ns.cpp中,在名稱空間中聲明了一個類。 該類的定義如下。
該類中的變量將被全局訪問。 這是名稱空間的目標。
ns_call.cpp然后訪問該類的成員1,x1。
這兩個文件在Fedora 14中使用gcc 5.4.1編譯正確。運行輸出為:
pre 2
post 2
我期望“ post 100”,因為我想全局訪問A類的int x1。
extern
, namespace
或forward聲明似乎都不表示您認為的含義。
如果您想引入一個可以在多個翻譯單元中使用的名稱(當您說“全局”時,這似乎意味着什么),則可以將這些定義放在頭文件中,並在要使用的任何位置#include
該頭。
您實際上正在做的是在每個翻譯單元中(例如,在每個CPP文件中)一次又一次地引入class A
。 這充其量是對ODR的違反。
我只是想幫助您解決問題,而您絕對必須注意有關ODR(一個定義規則)的其他答案並修正您的設計。
在ns.cpp
文件中,您必須移動ns::A a;
行ns::A a;
在main()
函數之外。 將其放在文件范圍內(例如, ns_call.cpp
在main
之前。)此外,在ns_call.cpp
文件中,將extern ns::A a;
行移到該位置extern ns::A a;
超出功能范圍。
注意:您可能必須做第二部分,也可能不必,第二部分可能也不行。 我現在無權使用編譯器。
同樣,我必須同意其他評論,認為該設計存在缺陷, 會引起您的頭痛。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.