4

インターネットで便利なコード例を何度も見つけます。約半分の時間、コマンドラインで-lを使用して、含めるファイルや含めるライブラリを指定していません。通常、どうやってそれを見つけますか?

編集メモ:以下の問題は解決されました。この投稿の残りの部分はスキップできます。

現在、コンパイルしようとすると大量のエラーが発生します。

53: string Gunzip::gunzip(string& compressed)
54: {
55:   namespace io = boost::iostreams;
56:
57:   io::filtering_istream gunzip;
58:   gunzip.push(io::gzip_decompressor());
59:   std::istringstream in_stream = std::istringstream(compressed);
60:   gunzip.push(in_stream);
61:
62:   stringstream strstream;
63:   io::copy(gunzip, strstream);
64:   return strstream.str();
65: }

インターネットで1日過ごした後、私は次のことを試みています。

option: 3 -L/usr/include/boost
and:
 8: #include <string>
 9: #include <iostream>
10: #include <sstream>

15: #include <boost/iostreams/copy.hpp>
16: #include <boost/iostreams/device/array.hpp>
17: #include <boost/iostreams/device/back_inserter.hpp>
18: #include <boost/iostreams/filter/gzip.hpp>
19: #include <boost/iostreams/filter/test.hpp>
20: #include <boost/iostreams/filtering_stream.hpp>

私が持っているエラーは次のとおりです。

                 from /usr/include/c++/4.5/string:45,
                 from Gunzip.cpp:8:
/usr/include/c++/4.5/bits/ios_base.h: In copy constructor     ‘std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)’:
In file included from /usr/include/c++/4.5/bits/localefwd.h:43:0,
/usr/include/c++/4.5/bits/ios_base.h:785:5: error: ‘std::ios_base::ios_base(const     std::ios_base&)’ is private
/usr/include/c++/4.5/iosfwd:77:11: error: within this context
/usr/include/c++/4.5/iosfwd: In copy constructor     ‘std::basic_istringstream<char>::basic_istringstream(const     std::basic_istringstream<char>&)’:
/usr/include/c++/4.5/iosfwd:97:11: note: synthesized method     ‘std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)’ first required here 
/usr/include/c++/4.5/streambuf: In copy constructor     ‘std::basic_stringbuf<char>::basic_stringbuf(const std::basic_stringbuf<char>&)’:
/usr/include/c++/4.5/streambuf:773:7: error: ‘std::basic_streambuf<_CharT,     _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>::__streambuf_type&)     [with _CharT = char, _Traits = std::char_traits<char>, std::basic_streambuf<_CharT,     _Traits>::__streambuf_type = std::basic_streambuf<char>]’ is private
/usr/include/c++/4.5/iosfwd:93:11: error: within this context
/usr/include/c++/4.5/iosfwd: In copy constructor     ‘std::basic_istringstream<char>::basic_istringstream(const     std::basic_istringstream<char>&)’:
/usr/include/c++/4.5/iosfwd:97:11: note: synthesized method     ‘std::basic_stringbuf<char>::basic_stringbuf(const std::basic_stringbuf<char>&)’ first     required here 
Gunzip.cpp: In member function ‘std::string Gunzip::gunzip(std::string&)’:
Gunzip.cpp:59:65: note: synthesized method     ‘std::basic_istringstream<char>::basic_istringstream(const std::basic_istringstream<char>&)’ first required here 
make[2]: Leaving directory `/home/albert/NetBeansProjects/Arb3'
make[1]: Leaving directory `/home/albert/NetBeansProjects/Arb3'
make[2]: *** [build/Debug/GNU-Linux-x86/Gunzip.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 9s)

最初の3つのインクルードを削除して、理解できない他のエラーを取得できます。どのエラーが良いのかわかりません。

  1. このエラーはインクルードに関連していますか?どうすればわかりますか?これまでのところすべてのエラーはインクルードによるものだったので、私はインクルードを非難しています。basic_iosが何であるかわかりません。
  2. 何を含めるか、どのライブラリを使用するかをどのように見つけますか?
4

3 に答える 3

5

あなたが投稿したエラーは、実際にはインクルード関連のエラーではなく、次の行のリンカ エラーです。

std::istringstream in_stream = std::istringstream(compressed);

これにより、プライベートとしてマークされた継承されたコピー コンストラクターが呼び出されるため、次のように置き換える必要があります。

std::istringstream in_stream(compressed);

この場合、コンパイラの出力は実際には非常に明確です。

于 2011-07-16T17:44:53.373 に答える
1

短い答えは「場合による」です。C++ 標準ライブラリの一部であるクラス/関数については、コンパイラに付属のマニュアル ページに必要なヘッダーとライブラリがリストされています。または、 cplusplus.comMSDNGNU libstdc++ doxygen docsなどのオンライン リソースを使用することもできます。

Boost のようなものについては、ドキュメントを参照する必要があります。ただし、明らかな質問は、「クラスがブーストからのものであるかどうかをどのように知るか」です-これに対する答えはほとんど「Googleで検索する」です-時間の経過とともに、ブーストにあるものとないものに慣れるでしょう.

于 2011-07-16T16:41:48.107 に答える
0

一般に、必要なライブラリが見つからなかったり、ビルド方法や使用方法がわからない場合、そのような情報を見つけるのに最適な場所は、プロジェクトのドキュメントまたは wiki ページ、フォーラム、または IRC チャンネルです。クラス/関数が属するプロジェクトを見つけるには、クラス/関数の名前を使用して検索できます。

上記のコード スニペットにはBoostが必要です。ほとんどの場合#include、ヘッダー ファイルを作成するだけです。ただし、特定のライブラリでは、それらをビルドしてリンクする必要があります。手順については、「 Microsoft Windows での開始」または「Unix バリアント (Linux、MacOS など) での開始」を参照してください。

Windows マシンで作業している場合は、コンパイル済みのバイナリをhttp://www.boostpro.com/download/からダウンロードできます。

于 2011-07-16T16:40:19.243 に答える