我很困惑在拥有嵌套的命名空间和对象声明时该怎么做.
我正在移植一些链接到具有一些名称空间的静态库的代码.
我在说什么的例子:
namespace ABC {
namespace XYZ {
//STUFF
}
}
Run Code Online (Sandbox Code Playgroud)
在代码中我该怎么做来声明命名空间中的对象XYZ?
如果我尝试:
XYZ::ClassA myobject;
Run Code Online (Sandbox Code Playgroud)
要么:
ABC::XYZ::ClassA myobject;
Run Code Online (Sandbox Code Playgroud)
要么:
ABC::ClassA myobject;
Run Code Online (Sandbox Code Playgroud)
我明白了
没有命名类型
错误,即使ClassA确实存在.
什么是合适的?
ere*_*eOn 48
这取决于您已经拥有的命名空间:
如果您没有名称空间或其他不相关的名称空间,则必须指定整个路径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
}
}
Run Code Online (Sandbox Code Playgroud)
如果myobject在该命名空间中声明并且您想要再次声明它(用于定义它),则可以通过为其名称添加前缀而不是其类型来实现.
ClassA ABC::XYZ::myobject;
Run Code Online (Sandbox Code Playgroud)
如果其类型也在该命名空间中声明,则还需要为该类型的名称添加前缀
ABC::XYZ::ClassA ABC::XYZ::myobject;
Run Code Online (Sandbox Code Playgroud)
重新声明像这样的对象很少需要.通常,对象的第一个声明也是它的定义.如果要首先声明对象,则必须在该命名空间中执行此操作.以下声明并定义"myobject"
namespace ABC {
namespace XYZ {
ClassA myobject;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你已经在这样的对象中定义了,你可以通过这样的方式来引用它ABC::XYZ.您不必以某种方式"声明"该对象以便在本地使用它
void f() {
ABC::XYZ::myobject = someValue;
// you *can* however use a using-declaration
using ABC::XYZ::myobject;
myobject = someValue;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32915 次 |
| 最近记录: |