8

非常に奇妙な症状に遭遇しました。根本的な原因が何であるかを誰が教えてくれますか?

私の VC++ コンパイラのバージョンは最新です: "Microsoft Visual C++ 2010 : 01019-532-2002102-70860"

再現する手順:

  1. 空の win32 コンソール プロジェクトを作成する
  2. main.cpp という名前の新しい cpp ファイルを追加します。
  3. 次のコードを main.cpp に貼り付けます
  4. コンパイル
  5. コンパイラがクラッシュし、次のメッセージが報告されます。

\bug\main.cpp(54893757): 致命的なエラー C1001: コンパイラで内部エラーが発生しました。(コンパイラ ファイル 'msc1.cpp'、1420 行目)

この問題を回避するには、上記の場所の近くでプログラムを単純化または変更してみてください。詳細については、Visual C++ ヘルプ メニューのテクニカル サポート コマンドを選択するか、テクニカル サポート ヘルプ ファイルを開いてください。

挿入されたテキストでこのエラーが発生しました:

d:\bug\main.cpp(63) : [ T=int ] でコンパイルされている関数テンプレートのインスタンス化 'XDummy Test(T)' への参照を参照してください

ビルドに失敗しました。

以下は、main.cpp のソース コードです。

#include <vector> 

template<class It_> 
struct trait_dummy 
{ 
    static const int value = std::tr1::is_convertible<typename iterator_traits<It_>::iterator_category, int>::value;     
}; 

template<class It_> 
class X 
{ 
public: 
    template<class T_> 
    X(T_& rColl) 
    {} 
}; 

template<class T_> 
X<typename T_::iterator> f(T_ rColl, std::false_type) 
{ 
    return X<typename T_::iterator>(rColl); 
} 

template<class T_> 
auto f(T_& rColl) -> decltype(f(rColl, std::false_type())) 
{ 
    return f(rColl, std::false_type()); 
} 

template<class It_> 
X<It_> f(It_ first, size_t nSize, typename std::tr1::enable_if<trait_dummy<It_>::value>::type* dummy = 0) 
{ 
    return X<It_>(first, first + nSize); 
} 

class XTest 
{ 
public: 
    void foo() 
    { 
        auto v = f(m_Suite); 
    }    

    std::vector<int> m_Suite; 
}; 

const int g_dummy = 0; 
class XDummy 
{ 
public: 
    XDummy(int, int, int, int dummy = g_dummy) 
    {} 
}; 

template<class T> 
XDummy Test(T) 
{    
    return XDummy(0, 0, 0); 
} 

int main() 
{ 
    Test(0); 
    //XTest().foo(); 

    return 0; 
}
4

2 に答える 2

5

自分で何らかのトラブルシューティングを試しましたか?

あなたが説明したように、上記のソースコードを使用してクラッシュを再現できます。もちろん、いくつかの警告が表示されます。

  • 「IntelliSense: オーバーロードされた関数 "f" のインスタンスが引数リストと一致しません」
  • 「IntelliSense: 関数呼び出しの引数が少なすぎます」

どちらもこの行を参照しています:

auto v = f(m_Suite); 

トラブルシューティングをさらに数秒間行うと、クラス全体をコメントアウトすることXTestで、コードが問題なく (そして最も重要なこととして、コンパイラをクラッシュさせることなく) コンパイルおよび実行されることがわかります。XTestこれは、問題が明らかにクラス内のどこかにあることを示しています (そして、あなたに通知する必要があります) 。
生成されているコンパイラ エラーと関係があるのではないかと思わずにはいられません。

では、コンパイラ エラーを生成している 1 行をコメント アウトするだけではどうでしょうか。あなたは何を知っていますか!コードは問題なくコンパイルおよび実行されます。

そのため、約 1 分もかからずに、原因を 1 行のコードに絞り込みました。ただし、すべてのコードが何を行っているかを正確に理解するために実際に時間をかけるつもりはありません。なぜなら、どこに努力を集中すべきかが正確にわかっているので、ここから理解できると思うからです。これらの IntelliSense エラーを修正することから始めて、コンパイラをクラッシュさせずにコードがコンパイルされるかどうかを確認します。

于 2010-11-27T06:20:54.827 に答える
-1

コンパイラの作成者は、有効な入力から有効な出力を生成するコンパイラの機能に影響を与えないコンパイラのバグを修正することをあまり優先しません。そして、これらのバグの中で、無効な出力を静かに生成しないバグの優先度が最も低くなります。

したがって、あなたの質問に対する答えは、このバグが以前に報告されていないか、非常に低い優先度が割り当てられている可能性が高いということです。

于 2011-08-25T22:52:22.500 に答える