我写了一些头文件。我想单独声明名称空间层次结构(为了清楚起见),然后声明函数和类。对我来说,它看起来像文档中的目录。对我来说非常方便:在一个地方查看名称空间的完整层次结构。我写这个:
// 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。
谢谢。
答案 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扩展,因此您的代码不会跨平台。
希望这会有所帮助。不知。