1

Visual Studio 2005 (C++) にコンパイラ エラーの "コール スタック" はありますか?

たとえば、boost::scoped_ptr を QHash の値として使用しています。ただし、これにより次のコンパイル エラーが発生します。

1>c:\qt\include\qtcore\../../src/corelib/tools/qhash.h(743) : error C2248: 'boost::scoped_ptr<T>::operator =' : cannot access private member declared in class 'boost::scoped_ptr<T>'

ビルド出力から、エラーの原因となっているソース ファイルとエラーの原因となっている qhash.h の行番号がわかりますが、エラーを生成しているソース ファイルの行番号を追跡しようとしています (したがって、 「コールスタック」のアイデア)。

QHash で scoped_ptr を使用する問題の解決策を探しているのではなく、コンパイル エラーが生成された場所を追跡する問題を探していることに注意してください。これは、奇妙な警告を追跡するのにも役立ちます。テンプレート化されたクラスを使用しているときに、この問題に遭遇することがよくあります。

ありがとう!

4

3 に答える 3

2

奇妙なエラーが発生した場合は、ファイルを前処理してその出力を確認すると役立つことがあります。VSでは、プリプロセッサ設定で「前処理済みファイルの生成」を探します(または/ Pスイッチを設定します)。これにより、XXX.cppからXXX.iが生成され、問題の特定に役立つ場合があります。

後でスイッチをオフにしてください。このオプションをオンにすると、objファイルは生成されません。

于 2009-07-10T15:08:44.433 に答える
0

ビルド出力を見ると、このエラーが発生したときにどのプロジェクトとどの .cpp ファイルがコンパイルされていたかがわかります。

コンパイラは一度に 1 つのソース ファイルを処理するため、ここでは「コール スタック」という概念は実際にはありません。ヘッダー ファイルにコンパイル エラーがあるため、そのヘッダーを含むどのソース ファイルがコンパイルされていたかを調べる必要があります。

于 2009-07-10T14:49:31.643 に答える
0

これらのタイプのエラーは、追跡するのが難しい場合があります。通常、コードをコメントアウトし、問題のある行を見つけてそこから作業することになります。しばらく実行すると、エラー メッセージをよりよく読み、コンパイラがトリップした原因を理解できるようになります。現状では、コンパイラのエラー メッセージはひどいものです。

この場合、boost::scoped_ptr<T>コピーしようとしているタイプのオブジェクトがあるが、クラスが許可しないことを示しています (operator= とコピー ctor は両方とも隠されています)。そのため、クラスがどのように使用されているかを調べ、なぜそれをコピーしようとしているのかを確認する必要があります。scoped_ptr必要なものではないかもしれません。多分あなたは必要shared_ptrですか?

于 2009-07-10T15:06:01.240 に答える