为什么我不能在头文件中单独编写名称空间的层次结构?

时间:2013-07-12 08:50:26

标签: c++ visual-studio

我写了一些头文件。我想单独声明名称空间层次结构(为了清楚起见),然后声明函数和类。对我来说,它看起来像文档中的目录。对我来说非常方便:在一个地方查看名称空间的完整层次结构。我写这个:

// Namespaces hierarchy:
namespace Bushman{
    namespace CAD_Calligraphy{}
    //...
}

// Declarations of classes and functions
class Bushman::CAD_Calligraphy::Shp_ostream{
public:
    explicit Shp_ostream(std::ostream& ost);
};

但是MS Visual Studio以这种方式创建头文件。我应该这样写:

namespace Bushman{
    namespace CAD_Calligraphy{
        class Shp_istream{
        public:
            explicit Shp_istream(std::istream& ist);
        };
    }
}

为什么第一个变体不起作用?这是对C ++或IDE的限制吗?

P.S。我的其他问题是here

谢谢。

4 个答案:

答案 0 :(得分:10)

限制在§9/ 1中:“如果类头名包含 一个嵌套名称说明符,类说明符应引用 以前在类中直接声明的类 嵌套名称说明符引用的名称空间[...]“ 换句话说,类名的第一次出现不能在 像Bushman::CAD_Calligraphy::Shp_ostream这样的东西。

您可以做的是在初始中添加前向声明 层次结构的声明:

// Namespaces hierarchy:
namespace Bushman{
    namespace CAD_Calligraphy{
        class Shp_ostream;
        //...
    }
    //...
}

// Declarations of classes and functions
class Bushman::CAD_Calligraphy::Shp_ostream{
public:
    explicit Shp_ostream(std::ostream& ost);
};

根据标题的组织方式,甚至可能如此 从人的角度来看更好:你的标题以 一种对其中定义的内容的索引。

答案 1 :(得分:2)

引用标准:第7.3.1.2节第2点:

  

命名空间的成员也可以在其外部定义   命名空间通过名称的显式限定(3.4.3.2)   如果已经声明了已定义的实体,则定义   在命名空间中,定义出现在后面   在包含声明命名空间的命名空间中的声明。

namespace Q {
  namespace V
    void f();
  }
  void V::f() { /∗ ... ∗/ }    // ok. 
  void V::g() { /∗ ... ∗/ }    // Error: g() is not yet a member of V
  namespace V
    void g();
  }
}

namespace R {
   void Q::V::g() { /∗ ... ∗/ }   // // error: R doesn’t enclose Q
}

因此,如果您在那里声明了类名,那么您可以在原始帖子中执行所需操作:

namespace Bushman{
    namespace CAD_Calligraphy {
        class Shp_ostream;
        ...
    }
}

答案 2 :(得分:1)

这就是C ++的工作原理。

它与其他嵌套声明一致:您无法从类外部向类中添加成员:

class A
{
};

void A::f() { }  // Error!

并且您无法从外部向枚举添加枚举数:

enum E { E1 = 1, E2 = 2 };

E::E3 = 3;  // Error!

您需要“打开”范围并在范围内声明实体。一旦声明,您可以使用嵌套名称在该范围之外定义它:

class A
{
  void f();  // declare
};

void A::f() { }  // define

答案 3 :(得分:-1)

首先,C ++的设计并不像那样。所以发生这种情况并不奇怪。

但是,由于您使用的是Visual Studio,因此可以利用partial classes。不幸的是,似乎这个特性只与C ++ / CX有关,所以也许你不能使用它。

您仍然需要在命名空间层次结构中声明一个部分类,但我想它可能是空的。

说实话,我没有使用过这个功能,我不知道为了达到你想要的效果可以弯曲多远。但无论如何你可以尝试一下。

请记住,这是一个Visual Studio扩展,因此您的代码不会跨平台。

希望这会有所帮助。不知。