8

msvc (2005) のエラーの場所に関するより良い情報を取得する方法があるかどうか疑問に思っています。

たとえば、自分のクラスで boost::noncopyable から継承すると、次のような C2248 エラーが発生します。

エラー C2248: 'boost::noncopyable_::noncopyable::noncopyable': クラス 'boost::noncopyable_::noncopyable' で宣言されたプライベート メンバーにアクセスできません。この診断は、コンパイラによって生成された関数 'MyClass::MyClass(const MyClass &)' で発生しました。

しかし、コピーコンストラクターが呼び出された正確な場所を教えてくれません。これは少し面倒です。本当によくわかりませんが、出力レベルなどを指定できる設定をどこかに見たのを覚えていると思いますが、検索しても何も見つからなかったので、質問は次のとおりです。 ?

編集:スタックオーバーフローが答えを受け入れるようにすべきだと言ったので、msvc 2008/2010がこのエラーのより良い診断を提供するかどうかを誰かが知ることができるかどうか疑問に思っていましたか? 誰かがGCCがすべきだとも言いましたが、誰でもこれを確認できますか? 他のコンパイラ (Intel?、Comeau?) はどうですか?

ありがとう

4

5 に答える 5

4

Code::Blocks と VC++ 2005 で確認できますが、エラーが発生した場所のヒントはありません。独自のプライベート コピー コンストラクターを宣言することも役に立ちません。

#include <boost/noncopyable.hpp>

class X: boost::noncopyable
{
};

void foo(X x) {}

int main()
{

    X x;
    foo(x);
}

コンパイル ログ (5 行目はクラス宣言の最後の行です):

main.cpp(5) : error C2248: 'boost::noncopyable_::noncopyable::noncopyable' : cannot access private member declared in class 'boost::noncopyable_::noncopyable' C:\boost_1_38_0\boost/noncopyable.hpp(27) : see declaration of 'boost::noncopyable_::noncopyable::noncopyable' C:\boost_1_38_0\boost/noncopyable.hpp(22) : see declaration of 'boost::noncopyable_::noncopyable' This diagnostic occurred in the compiler generated function 'X::X(const X &)'

より完全なエラー診断を有効にするコンパイラ スイッチがない限り、GCC (MinGW) でファイルをコンパイルして、より役立つエラー診断を取得するのはこれが初めてではありません。(残念ながら、コードには VC++ 拡張機能が含まれていない必要があります。)

于 2009-10-15T20:13:18.610 に答える
0

このエラーを追跡するためだけに、一時的に手動のコピー コンストラクター (同じ署名を使用) と既定の実装を作成できます..? それが見つけやすくなるかどうかはわかりません。

于 2009-10-15T20:01:41.890 に答える
0

実際、これを回避する最善の方法 (ここでは VS2013) は、出力ウィンドウを繰り返しクロールするようです。

1/ 出力に「この診断は、コンパイラによって生成された関数 'X::X(const X &)' で発生しました」というメッセージが表示されたら、'X' クラスに移動し、C++ を使用してコピー コンストラクターを明示的に削除します。 11表記:「X(const X&) = delete;」

2/ 再コンパイルすると、出力に同じエラーが表示される必要がありますが、子クラスで診断が発生します。その後、手順 1 に再度ループして、実際に障害のあるクラスに到達するまで、子クラスのコピー コンストラクターを明示的に削除します...

于 2016-05-18T11:59:28.653 に答える
-1

出力ウィンドウまたはビルド ログで、コンパイラがコード内でテンプレートを使用しようとした場所を確認する必要がありますが、少しスクロールする必要があります。

ビルド ログに十分な情報がない場合は、msbuild の詳細度を制御するオプションもあります:
[ツール] -> [オプション] -> [プロジェクトとソリューション] -> [ビルドと実行] -> [MSBuild プロジェクトの出力の詳細度]

于 2009-10-15T19:54:26.773 に答える
-1

完全なビルド ログが表示される出力ウィンドウを開きます。そこでエラーメッセージを確認してください。通常、そのエラー メッセージの下に、問題の原因を追跡するのに役立つ詳細情報が表示されます。

エラー リストの問題をダブルクリックして出力ウィンドウに移動すると、カーソルがそのエラー メッセージに配置されます。

于 2009-10-15T20:02:25.743 に答える