当有嵌套的命名空间和对象声明时,我很困惑该做什么。
我正在移植一些链接到具有几个名称空间的静态库的代码。
我所说的例子:
namespace ABC {
namespace XYZ {
//STUFF
}
}在代码中,如何声明命名空间XYZ中的对象?
如果我试着:
XYZ::ClassA myobject;或者:
ABC::XYZ::ClassA myobject;或者:
ABC::ClassA myobject;我得到了
不命名类型
错误,即使ClassA确实存在。
这里合适的是什么?
发布于 2010-07-07 21:49:10
这取决于您已经存在的名称空间:
如果您没有名称空间或其他不相关的名称空间,那么您必须指定到整个路径ABC::XYZ::ClassA。
如果您在ABC中,可以跳过ABC,只需编写XYZ::ClassA。
此外,值得一提的是,如果您想引用不位于命名空间(或"root“命名空间)中的函数,则可以使用::作为前缀。
示例:
int foo() { return 1; }
namespace ABC
{
double foo() { return 2.0; }
void bar()
{
foo(); //calls the double version
::foo(); //calls the int version
}
}发布于 2010-07-08 06:34:14
如果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;
}https://stackoverflow.com/questions/3199139
复制相似问题