簡體   English   中英

C ++中的嵌套NameSpaces

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM