2017-12-15 43 views
0

gcc5.4.0を使用して大きなプロジェクトでmakeを実行すると、このエラーが発生しました。sstreamがパブリックアクセスコンパイラエラーで再宣言されました

/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で発生するので、間違ったコンパイラを使用していますか?ここで

は、コードスニペットているエラーメッセージはを参照してください:ラインで67

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

2)sstream提供行から始まる)

1. 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」と「Dpublic」フラグを中心に展開しそうです。私はコンパイラのフラグを仮定していますが、私は彼らが何をしているのか分かりません。

+1

がめちゃめちゃライブラリのメンテナのように見えると混乱のこの種のを避けるために、明示的なアクセスの資格を使用しますアップ。 –

+0

誰もこれについて何も考えていませんか?たぶん私は最善の方法を尋ねなかったが、私は本当にこれに追加する他の情報を知りません... –

答えて

0

githubのスレッドがスポットに当たっても、その理由を見逃しているようです。あなたは、最も可能性の高いいくつかのユニットかそこらのような「プライベート」キーワードを再定義し、プロジェクト内の他のテストを構築している。

#define private public 

または(-Dprivate=public)のようなコマンドを介して各ことを行います。これは、テストされたコードをテストコードに依存させることなく、テストのためにプライベートメンバーを公開するためによく使用される方法です。 ただし、スニペットを見てください。最初のものは__xfer_bufptrsを、あなたの定義がprivateであってもプライベートと宣言します。次の2番目のスニペットは明示的にprivateブロック内にあります(チェックしていません)。今あなたのプライベートの定義がある場合は、あなたは2番目のスニペットであるpublicと結びつきます。これは誤りです。

あなたは他にも確かに可能であり、少なくとも2つのオプションがあります。

  1. あなた#undefシステムヘッダを含め、それらのの混入した後、再び定義、または
  2. あなたが定義する別のマクロを使用する前に、民間の定義あなた自身の私的/公的セクション、例えば:#define my_public publicを自由に定義することができます。このソリューションは、しかし不快そうです;)

ああ、あなた自身のコード内の将来のためには、常に、少なくとも自分のコード:)

関連する問題