SSTREAM通过公共访问编译器错误重新编辑

sstream redeclared with public access compiler error

本文关键字:新编辑 编辑 错误 编译器 访问 SSTREAM      更新时间:2023-10-16

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

/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。)Sstream在第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}                                       
        {  

我知道标准库没有任何问题,所以为什么会丢下错误?

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

似乎答案围绕着这些" dprivate"answers" dpublic"旗帜旋转。我认为这是编译器标志,但我不确定他们的作用。

尽管Github的线程击中了现场,但似乎错过了原因。您很可能是在项目中构建一些单元或其他测试,以重新定义这样的"私人"关键字:

#define private public

或通过命令(-Dprivate=public)进行相应的事情。这是一种常用的实践,用于暴露私人成员进行测试,而无需使经过测试的代码取决于测试代码。但是,看看您的片段。第一个声明__xfer_bufptrs为私有,无论您对private的定义如何。下一个第二个摘要肯定是在明确的private块中(尚未检查)。现在,如果您对私有的定义已经存在,您将在第二个摘要中使用public来ned。

您至少有两个选项,另外还有可能:

  1. 您的 #undef私人定义包括系统标头并在包含这些标题后再次定义,或者
  2. 您使用另一个宏来定义自己的私人/公共部分,例如:#define my_public public可以随意重新定义。但是,这个解决方案似乎很奇怪;)

哦,对于未来,在您自己的代码中,始终使用明确的访问资格,以避免使用自己的代码来避免这种混乱:)