1

g ++は、間違って使用している関数の多くの「候補」を教えてくれるので、コンパイラエラーは非常に長くなります。私に何ができる?

server.cpp:78:51: note: candidates are:
/usr/include/boost/asio/buffer.hpp:599:26: note: boost::asio::mutable_buffers_1  boost::asio::buffer(const boost::asio::mutable_buffer&)
/usr/include/boost/asio/buffer.hpp:599:26: note:   candidate expects 1 argument, 2 provided
... 30 lines of error for one wrong line of code
4

1 に答える 1

4

C ++は優れた、重量級のプログラミング言語ですが、読み取り可能なエラーメッセージを発行する方法を誰も理解していません。コンパイラの観点から見ると、エラーは複雑であるため、あなたが言及するエラーメッセージは複雑であると思います。時間をかけてメッセージを注意深く読み、しばらく考えてみると、なぜそうなのか理解し始めるかもしれません。

エラーメッセージを分解してみましょう。

server.cpp:78:51: note: candidates are:

これは、エラーがserver.cppの78行目(または51行目ですか?)で発生しているように見えることを意味します。 ただし、コンパイラがエラーであると判断する理由は、Boostヘッダーasio/buffer.hppにあります。 ヘッダーはおそらく複雑で正しいので、そのヘッダーを調べることはおそらく無益です。それでも、エラーメッセージの次の行は、Boostヘッダーから必要な情報を抽出します。

note: boost::asio::mutable_buffers_1  boost::asio::buffer(const boost::asio::mutable_buffer&)

では、 server.cppの78行目に戻って、電話をかけましboost::asio::buffer()たね。括弧の間の引数として、その関数はタイプのオブジェクトを必要としますboost::asio::mutable_buffer。あげましたか?はいの場合、よろしいですか?明らかに、何らかの理由で、コンパイラは引数が正しい型であると認識しません。

次に、エラーの3行目を見てみましょう。

note:   candidate expects 1 argument, 2 provided

したがって、実際には、server.cppの78行目に戻って、に1つではなく2つの引数を指定しましたboost::asio::buffer()。つまり、 -boost::asio::buffer(x, y)ではなく呼び出しboost::asio::buffer(x)た、または呼び出していない場合は、コンパイラは呼び出したと見なします。

これらの手順をトレースします。彼らはあなたの問題を解決するはずです。

参考までに、画面の半分以上を占めるC++エラーメッセージが表示されることがよくあります。私はあなたよりもそれらが好きではありませんが、コンパイラがそれらを発行する理由は理解しています。特にC++の強力なテンプレート機能は、ライブラリ機能が誤用されたときにかなり大きなエラーメッセージを表示します。それは言語の性質です。C ++でプログラミングする場合、ほとんど何もできませんが、この性質に自分自身を調和させることができます。

于 2012-06-28T01:37:15.443 に答える