2

我正在构建一个仅包含标题的库(有充分的理由;不要讨厌),其中包含一个类和类成员函数的实现。在这样做时,我遇到了一个非常奇怪的错误<unordered_set>。对 GCC 的 Bugzilla 的搜索似乎没有解决这个问题。

我的代码中断(严重)在我的命名空间中有包含。

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
{
...

我正在使用带有 -std=c++11 的 GCC g++ 4.8 来构建此代码,该代码适用于第二种配置,并且<unordered_map>在两种配置中都可以使用。

这可能是一个 libstdc++ 错误吗?海湾合作委员会错误?

4

1 回答 1

10

您不应将标准#include指令放在命名空间内。请参阅 C++14 [using.headers]/3(这是关于标准库的头文件):

翻译单元应仅在任何外部声明或定义之外包含标头,并且应在对其在该翻译单元中声明或首先定义的任何实体的第一次引用之前在词法上包含标头。

于 2015-08-27T21:32:32.177 回答