2011-06-15 101 views
1

我知道在C++/CLI中允許嵌套命名空間。所以我的問題是,如果我們有這樣的事情:在C++/CLI中嵌套命名空間

... 
namespace one 
{ 
    // blah blah blah 
    // ... 

    namespace two 
    { 
     // another set of blah blah blah 
     // ... 
    } 
} 

,我需要使用一些函數和變量在命名空間2,我用:

one::two 

one.two 

另一個問題是,如果我有一個像

using namespace one; 

做我有機會在任何嵌套的命名空間的變量和函數一樣

namespace two 

我這麼問是因爲,在一些程序中,我已經看到了(和書面),有這樣的:

using namespace System; 
using namespace System::Text; 
using namespace System::IO; 

是不是系統命名空間應該覆蓋系統::文本系統:: IO名稱空間?

回答

4

您需要使用

one::two::some_variable_or_function 

.操作是用於訪問非靜態struct/class成員。然後可以通過範圍解析運算符::再次訪問靜態成員。

如果你只是會使用using System;,你可以通過

Text::some_function_or_variable 

using父命名空間訪問System::Text函數/變量並不意味着進口的所有子命名空間。

+0

更正確地說,點運算符訪問類的實例成員,靜態成員也可以通過使用'::' – 2011-06-15 11:54:33

+1

@Fabio來訪問:我已經更正了那個;-) – rubenvb 2011-06-15 11:57:43

3
  1. 是的,你需要在一個嵌套命名空間使用one::two,而不是one.two使用符號。

  2. 如果您只是使用namespace one;,則不會自動獲得對嵌套名稱空間的訪問權限。你將不得不使用two::

例子:

namespace one 
{ 
    int i; 

    namespace two 
    { 
     int j; 
    } 
} 

如果你使用:

using namespace one; 

代碼如下:

i = 1; 
two::j = 2; 

如果你使用:

using namespace one; 
using namespace one::two; 

代碼如下:

i = 1; //Compile fails if no "using namespace one". 
j = 2; 
+0

謝謝。剛剛發現,我立即發佈了這個問題。 – afaolek 2011-06-15 11:27:52

2

一般情況下,你使用,只有當你指的是一個實例中的一員,並::其他地方的點。因此,要訪問名稱空間two中的內容,您可以將它稱爲one::two::whatever

至於using namespace System;,它會從System命名空間導入東西。雖然System::IOSystem::TextSystem中,但它不會將它們直接導入到當前名稱空間中。 AFAIK,你可以說using namespace System;,然後將一個嵌套名稱空間中的類稱爲IO::Stream。但是,如果你使用了一堆命名空間,那會很快令人困惑。

0

1)one :: two
2)using父名稱空間不會自動擴展任何嵌套名稱空間。

2

一個:二個

one.two

您需要使用一個:二個。 one.two是的語法訪問Java

的另一個問題是,如果我有一個 聲明就像使用一個命名空間

;

做我訪問的變量和 功能在任何嵌套的命名空間 像

命名空間2

沒有,你可以用它們作爲two::而不是one::two::

我在問,因爲在一些程序中,我 已經看到(和寫),那裏的 類似:

using namespace System;
using namespace System :: Text;
使用命名空間System :: IO;

是不是系統命名空間應該是 覆蓋了System :: Text和System :: IO命名空間?

沒有,它們是不一樣的。您必須指定每個子名稱空間的用法

相關問題