C++ 如何在C++;?

C++ 如何在C++;?,c++,namespaces,typedef,using,qualified-name,C++,Namespaces,Typedef,Using,Qualified Name,在Java中,我发现使用名称空间非常简单。对于我在源文件中使用的每个限定标识符Ident,我放置一个import ns1.ns2.ns2.ns3.ns4.Ident位于文件顶部。然后,我可以在源代码的任何地方使用(短)非限定名称。import语句不会导致任何问题,因为它只适用于写入它的文件 不过,我不太清楚如何在C++中去掉命名空间限定符。最好的方法。< /P> 最令人厌恶的解决方案可能是使用和使用命名空间语句。然而,这似乎是一个相当糟糕的解决方案,至少在头文件的情况下是这样,因为using语句

在Java中,我发现使用名称空间非常简单。对于我在源文件中使用的每个限定标识符
Ident
,我放置一个
import ns1.ns2.ns2.ns3.ns4.Ident位于文件顶部。然后,我可以在源代码的任何地方使用(短)非限定名称。
import
语句不会导致任何问题,因为它只适用于写入它的文件

不过,我不太清楚如何在C++中去掉命名空间限定符。最好的方法。< /P> 最令人厌恶的解决方案可能是

使用
使用命名空间
语句。然而,这似乎是一个相当糟糕的解决方案,至少在头文件的情况下是这样,因为using语句并不局限于写入它们的单个文件。因此,对于仅由头文件构成的slim库(其实现直接在头文件中)或一般情况下的头文件,不允许使用

到目前为止,我使用的另一个选项是为我在类中使用的每个限定名添加一个对应于类的私有部分中的
typedef
。因此,在将这种方法与Java进行比较时,我基本上采用了整个import语句列表,将
import
替换为
typedef
,并将其放在类声明中

但是,我并不喜欢这种方法,因为严格来说,我的类的用户不知道返回值和参数值的类型,因为方法声明中的类型是相应类的私有类型

好的,现在我们可以公开所有这些
typedef
内容。但这可能不是一个好主意,因为我们会多次重新定义每种类型。只要想想一个结构
ns1::ns2::ns3::MyStructure
和两个类
MyClassA
MyClassB
。这两个类都有一个方法,该方法实际上应该将
ns1::ns2::ns3::MyStructure
的一个实例作为参数。但是,由于每个类都重新定义了它用来除去长限定名的类型,因此这两个方法现在采用“不同”类型的参数,例如
MyClassA::MyStructure
MyClassB::MyStructure
。当我们有第三个类
MyClassC
时,它会变得更加吸引人,它与
MyStructure
的一个实例一起工作,并且需要用它调用这两个方法。此类是否应使用类型
MyClassA::MyStructure
MyClassB::MyStructure
MyClassC::MyStructure
声明此实例


< >我想知道的是:去掉命名空间限定符的最佳实践是什么?

参见:和:从其他两个问题中总结答案:C++中没有使用类语句的类/文件范围。一种解决方法是将using语句和类声明/定义包装到命名空间伪{…}中,并将typedef伪::MyClass MyClass放在伪命名空间之外。对我来说,将每个文件包装成一个虚拟名称空间似乎有点讨厌。我希望有一个共同的“设计模式”(从有效的C++或类似的书籍)来解决我的问题。“虚拟名称空间”真的是常见的、广泛分布的解决方案吗?