在 Java 中,我发现使用命名空间非常简单。对于我在源文件中使用的每个限定标识符Ident
,我在文件import ns1.ns2.ns2.ns3.ns4.Ident;
顶部放置了一个。然后我可以在我的源代码中到处使用(短)非限定名称。该import
语句不会引起任何问题,因为它仅适用于记录它的文件。
但是,我不太确定如何以最佳方式摆脱 C++ 中的命名空间限定符。
最明显的解决方案可能是using
andusing namespace
语句。然而,这似乎是一个相当糟糕的解决方案,至少在头文件的情况下,因为 using 语句不限于写下它们的单个文件。因此using
,在仅由头文件组成的苗条库的情况下,或者在一般头文件的情况下,排除了这种情况。
到目前为止,我使用的另一个选项是为我在类中使用的每个限定名称添加一个对应typedef
于类的私有部分的名称。因此,当将此方法与 Java 进行比较时,我基本上将整个 import 语句列表,替换为import
withtypedef
并将其放在类声明中。
但是,我不太喜欢这种方法,因为我的类的用户——严格来说——不知道返回值和参数值的类型,因为方法声明中的类型是对应类的私有类型。
好的,现在我们可以typedef
公开所有这些东西了。但这可能不是一个好主意,因为我们会多次重新定义每种类型。想想一个 structns1::ns2::ns3::MyStructure
和两个 ClassesMyClassA
和MyClassB
. 这两个类都有一个方法,该方法实际上应该将ns1::ns2::ns3::MyStructure
. 但是因为每个类都重新定义了它用来摆脱长限定名的类型,所以这两种方法现在采用“不同”类型的参数,比如MyClassA::MyStructure
and MyClassB::MyStructure
。当我们有第三个类MyClassC
使用它的实例MyStructure
并且需要用它调用这两个方法时,它变得更加吸引人。这个类应该用类型声明这个实例MyClassA::MyStructure
,MyClassB::MyStructure
还是MyClassC::MyStructure
?
好吧,我只想知道:摆脱命名空间限定符的最佳做法是什么?