我很困惑在拥有嵌套的命名空间和对象声明时该怎么做。
我正在移植一些链接到具有几个名称空间的静态库的代码。
我在谈论的例子:
namespace ABC {
namespace XYZ {
//STUFF
}
}
在代码中,如何声明名称空间XYZ
中的对象?
如果我尝试:
XYZ::ClassA myobject;
或:
ABC::XYZ::ClassA myobject;
或:
ABC::ClassA myobject;
我得到了
未命名类型
错误,即使ClassA
肯定存在。
这里适当的是什么?
答案 0 :(得分:47)
这取决于您已经拥有的命名空间:
如果您没有名称空间或其他不相关的名称空间,则必须指定整个路径ABC::XYZ::ClassA
。
如果您在ABC
,则可以跳过ABC
,然后只写XYZ::ClassA
。
另外,值得一提的是,如果要引用不在命名空间(或“根”命名空间)中的函数,可以用::
作为前缀:
示例:
int foo() { return 1; }
namespace ABC
{
double foo() { return 2.0; }
void bar()
{
foo(); //calls the double version
::foo(); //calls the int version
}
}
答案 1 :(得分:5)
如果在该命名空间中声明myobject
并且您想再次声明它(用于定义它),则可以通过为其名称添加前缀而不是其类型来实现。
ClassA ABC::XYZ::myobject;
如果其类型也在该命名空间中声明,则还需要在类型名称前加上
ABC::XYZ::ClassA ABC::XYZ::myobject;
很少需要重新声明像这样的对象。通常,对象的第一个声明也是它的定义。如果要首先声明对象,则必须在该命名空间中执行此操作。以下声明并定义“myobject”
namespace ABC {
namespace XYZ {
ClassA myobject;
}
}
如果您已在此类对象中定义,请通过说ABC::XYZ
来引用它。您不必以某种方式“声明”该对象以便在本地使用它
void f() {
ABC::XYZ::myobject = someValue;
// you *can* however use a using-declaration
using ABC::XYZ::myobject;
myobject = someValue;
}