2015-08-27 44 views
2

我正在構建一個只包含頭文件的庫(出於很好的理由;不要討厭),它包含一個類以及類成員函數的實現。在這樣做時,我遇到了一個非常奇怪的錯誤<unordered_set>。海灣合作委員會的Bugzilla搜索似乎沒有解決這個問題。<unordered_set>中的錯誤?

我的代碼打破(嚴重)有我的名字空間內的包括。

namespace probability { 

#include <string> 
#include <unordered_set> // only this include breaks 
#include <unordered_map> 

class ProbabilityTools 
{ 
... 

一次偶然的機會,我感動的#includes類的命名空間之外,並與<unordered_set>解決了這一問題。當放置在名稱空間內時,其他包括引起此問題的只有<unordered_set>

#include <string> 
#include <unordered_set> // works when outside the namespace 
#include <unordered_map> 

namespace probability { 

class ProbabilityTools 
{ 
... 

我使用GCC克++ 4.8與-std = C++ 11建立這個代碼工作在所述第二配置和儘可能<unordered_map>使用的工作原理,在這兩種配置。

這可能是一個libstdC++錯誤? GCC bug?

+11

不要在命名空間中包含標準庫頭,這是代碼中的錯誤。 – mattnewport

+4

請注意,這不是STL。這將是C++標準庫的GCC實現。 – juanchopanza

+3

錯誤出現在您的代碼中,而不是庫中。庫包括不包含在命名空間內。 – SergeyA

回答

10

您不應該在命名空間內放置標準#include指令。請參閱C++ 14 [using.headers]/3(這是關於標準庫的標題):

翻譯單元應僅在任何外部聲明或定義之外包含標題,並且應包含標題在第一次引用它在該翻譯單元中聲明或首次定義的任何實體之前進行詞彙學習。

+1

[LWG 2225](http://wg21.link/lwg2225)已經爲C++ 14添加了「無需診斷」,並且[LWG 2428](http://wg21.link/lwg2428)刪除了「external 「,這是從C. –

+0

@TC複製粘貼錯誤好。 [intro.compliance]/1表示「語法和語義規則」需要診斷,除非另有說明,但我不確定哪些規則屬於該規定 –