2016-10-10 17 views
1

這是我的示例代碼及其輸出。爲什麼只需要在全局命名空間中包含向量(以及其他頭文件)?

namespace AAA 
{ 
#include <vector> 
} 

int main() 
{ 
    AAA::std::vector<int> vec; 

    return 0; 
} 

/usr/include/c++/4.9/new:129:41: error: 'void* AAA::operator new(AAA::std::size_t)' may not be declared within a namespace 
    __attribute__((__externally_visible__)); 
  1. 爲什麼不允許聲明命名空間中的運營商新/刪除?
  2. 標準要求包括<vector>(以及其他頭文件)是否來自全局命名空間?
+4

想一想這會做什麼。請記住'#include'指令只是擴展了包含文件中的文本。 –

+0

每個問題有一個問題。 –

+0

我寫了一些準確的內容來完成你所提到的 - 將矢量代碼放入命名空間。 – user1289

回答

3

是的,該操作符必須處於全局範圍。這是「特殊」。

[C++14: 3.7.4.1/1]:分配函數應該是類成員函數或全局函數;如果在全局作用域以外的名稱空間作用域中聲明瞭分配函數,或者在全局範圍內將其聲明爲靜態,則該程序會形成不良結構。 [..]

並且,是,標準庫標題必須爲「自由空間」 #include d:

[C++14: 17.6.2.2/3]:翻譯單元應只包括外的任何外部聲明的報頭或定義,並且應該在該翻譯單元中的第一個引用之前在詞彙上包含標題到在該標題中聲明的任何實體。不需要診斷。

相關問題