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

时间:2017-12-15 20:53:28

标签: 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;

对我来说,它似乎是编译器的一个问题?既然问题出现在标准的c ++库sstream中呢?这对我来说没有意义,我使用了错误的编译器吗?

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

1。)sstream从第67行开始

class basic_stringbuf : public basic_streambuf<_CharT, _Traits>                                   
    {                                                                                                 
      struct __xfer_bufptrs;                                                                          
    public:                                                                                           

2。)第300行的sstream

#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}                                       
        {  

我知道标准库没有任何问题,为什么会抛出错误?

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

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

1 个答案:

答案 0 :(得分:5)

虽然github上的主题击中了现场,但似乎错过了原因。您最有可能在项目中构建一些单元或其他测试,重新定义私有&#39;像这样的关键字:

#define private public

或者通过像(-Dprivate=public)这样的命令来做相应的事情。这是一种常用的做法,可以在不使测试代码依赖于测试代码的情况下公开私有成员进行测试。 但是看看你的片段。无论您对__xfer_bufptrs的定义如何,第一个都将private声明为私有。在明确的private块中,下一秒片段肯定是(虽然没有经过检查)。现在,如果您对private的定义已经到位,您将在第二个片段中找到public,这是一个错误。

您至少有两个选项,其他选项当然也是可能的:

  1. 您在包含系统标头之前#undef私有定义,并在包含系统标头后再次定义,或
  2. 您使用另一个宏来定义您自己的私人/公共部分,例如:#define my_public public,可以随意重新定义。这个解决方案似乎很狡猾;)
  3. 哦,对于您自己代码中的未来,总是使用显式访问限定,以避免这种混乱,至少使用您自己的代码:)