命名空间嵌套在C ++ / CLI中

时间:2011-06-15 11:22:05

标签: visual-c++ namespaces c++-cli nested managed-c++

我知道在C ++ / CLI中允许嵌套命名空间。所以我的问题是,如果我们有这样的事情:

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

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

我需要在 命名空间二 中使用一些函数和变量,我是否使用:

one::two

one.two

另一个问题是,如果我有一个像

这样的陈述
using namespace one;

我是否可以访问任何嵌套命名空间中的变量和函数,例如

namespace two

我问,因为在我看过(和写过)的一些程序中,有类似的东西:

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

系统命名空间是否应该涵盖 System :: Text System :: IO 命名空间?

5 个答案:

答案 0 :(得分:4)

您需要使用

one::two::some_variable_or_function

.运算符用于访问非静态struct / class成员。然后可以通过范围解析运算符::再次访问静态成员。

如果您只使用using System;,则可以通过

访问System::Text个函数/变量
Text::some_function_or_variable

using父命名空间并不意味着导入所有子命名空间。

答案 1 :(得分:3)

  1. 是的,您需要使用one::two代替one.two来访问嵌套命名空间中的符号。

  2. 如果您只使用namespace one;,则不会自动获得嵌套命名空间的访问权限。您必须使用two::

  3. 示例:

    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;
    

答案 2 :(得分:2)

通常,只有在引用实例成员时才使用点,而在其他任何地方使用::。因此,要访问名称空间two中的内容,您可以将其称为one::two::whatever

至于using namespace System;,它会从System命名空间导入内容。虽然System::IOSystem::Text位于System,但它不会将它们直接导入当前命名空间。 AFAIK你可以说using namespace System;然后引用嵌套命名空间中的一个类,比如IO::Stream。但是,如果你使用一堆命名空间,这会很快混淆。

答案 3 :(得分:2)

  

一个:: 2

     

     

one.two

您需要使用 one :: two 。 one.two是 Java 访问的语法

  

另一个问题是,如果我有一个   声明如

     

使用命名空间一;

     

我是否可以访问变量和   任何嵌套命名空间中的函数   像

     

命名空间二

,您可以将其用作two::而不是one::two::

  

我问,因为在某些程序中我   已经看过(和写过),有   类似的东西:

     

使用命名空间系统;
  使用命名空间System :: Text;
  使用命名空间System :: IO;

     

不应该是System命名空间   涵盖System :: Text和System :: IO   命名空间?

,它们不一样。您必须指定每个子命名空间的 usage

答案 4 :(得分:0)

1)one :: two
2)using父命名空间不会自动扩展任何嵌套命名空间。