[英]Nested NameSpaces in C++
我很困惑在擁有嵌套的命名空間和對象聲明時該怎么做。
我正在移植一些鏈接到具有一些名稱空間的靜態庫的代碼。
我在說什么的例子:
namespace ABC {
namespace XYZ {
//STUFF
}
}
在代碼中我該怎么做來聲明名稱空間XYZ
的對象?
如果我嘗試:
XYZ::ClassA myobject;
要么:
ABC::XYZ::ClassA myobject;
要么:
ABC::ClassA myobject;
我明白了
沒有命名類型
錯誤,即使ClassA
肯定存在。
什么是合適的?
這取決於您已經擁有的命名空間:
如果您沒有名稱空間或其他不相關的名稱空間,則必須指定整個路徑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
}
}
如果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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.