2011-06-15 110 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命名空间?

没有,它们是不一样的。您必须指定每个子名称空间的用法

相关问题