用公共访问编译器错误重新声明了sstream

mir*_*o_x 2 c++ compiler-errors sstream

使用gcc5.4.0在大型项目上运行make时,我遇到了此错误。

/usr/include/c++/5/sstream:300:14: error: '__xfer_bufptrs' redeclared with 'public' access
      struct __xfer_bufptrs
             ^
/usr/include/c++/5/sstream:67:14: note: previously declared 'private' here
      struct __xfer_bufptrs;
Run Code Online (Sandbox Code Playgroud)

在我看来,编译器似乎有问题?由于问题出现在标准c ++库sstream中?这对我来说没有意义,我使用的是错误的编译器吗?

以下是错误消息所引用的代码片段:

1.)从第67行开始

class basic_stringbuf : public basic_streambuf<_CharT, _Traits>                                   
    {                                                                                                 
      struct __xfer_bufptrs;                                                                          
    public:                                                                                           
Run Code Online (Sandbox Code Playgroud)

2.)在第300行进行流式传输

#if _GLIBCXX_USE_CXX11_ABI                                                                            
      // This type captures the state of the gptr / pptr pointers as offsets                          
      // so they can be restored in another object after moving the string.                           
      struct __xfer_bufptrs                                                                           
      {                                                                                               
        __xfer_bufptrs(const basic_stringbuf& __from, basic_stringbuf* __to)                          
        : _M_to{__to}, _M_goff{-1, -1, -1}, _M_poff{-1, -1, -1}                                       
        {  
Run Code Online (Sandbox Code Playgroud)

我知道标准库不会有任何问题,为什么它会引发错误?

这是我最接近的答案:https : //github.com/PacificBiosciences/pbbam/issues/14

答案似乎围绕着这些“ Dprivate”和“ Dpublic”标志。我假设是编译器标志,但是我不确定它们会做什么。

Fëa*_*rto 6

尽管github上的主题很流行,但似乎没有找到原因。您很可能在项目中构建一些单元或其他测试,以重新定义“ private”关键字,如下所示:

#define private public
Run Code Online (Sandbox Code Playgroud)

或者通过(-Dprivate=public)之类的命令执行相应的操作。这是一种常见的做法,可以公开私有成员进行测试,而无需使测试代码依赖于测试代码。但是,请查看您的片段。__xfer_bufptrs无论您对的定义如何,第一个都会声明为私有private。接下来的第二个代码段肯定(尽管未检查)在显式private块中。现在,如果您对private的定义到位,您将public在第二个片段中找到答案,这是一个错误。

您至少有两个选择,其他当然也可以:

  1. #undef在包含系统头之前先定义私有,然后在包含系统头后再次定义,或者
  2. 您可以使用另一个宏来定义自己的私有/公共部分,例如:#define my_public public可以随意重新定义。虽然这个解决方案似乎很棘手;)

哦,为了将来使用自己的代码,请始终使用显式访问限制,以避免至少与您自己的代码发生这种混乱:)