2

MSVC6からMSVC2008に切り替えようとしているときに、常に内部コンパイラエラーが発生しています。プログラムのさまざまな部分をコメントアウトする作業を重ねた後、2つの異なるCPPファイルの2行のコードでエラーを追跡しました。これらのCPPファイルは両方とも正常にコンパイルされますが、エラーが他のファイルに現れるかどうかに何らかの影響があります。

これらの行は両方とも、いくつかの複雑なネストされたテンプレートのインスタンス化を伴います。また、テンプレートパラメータの1つとして抽象クラスを使用するアプリ内の唯一の場所のようです。とは言うものの、この問題が抽象クラスまたはテンプレートのいずれかに関係していることは確かではありません。これは私が気付いた中で最も明白なことです。これらの線がまったく重要であるかどうかさえ確信できません。ただし、次のようになります。

m_phDSAttributes = new SObjDict<RWCString, SIDataSource>(&RWCString::hash);

つまり、テンプレート化されたディクショナリクラスであるSObjDict、抽象インターフェイスであるSIDataSourceがあり、パラメータはRWCStringの静的メンバー関数へのポインタです。

私はコードをいじってみましたが、あるCPPファイルから別のCPPファイルに移動するときにエラーが発生することがあります(たとえば、一連のテンプレート宣言を使用classからに変更しましたtypename)が、韻が見つかりませんまたはそれに理由。

この問題をさらにデバッグする方法がわかりません。コンパイラによって出力される正確なエラー(ソースファイルの名前が変更されたもの)は以下のとおりです。インターネットのどこにもそれについての言及はありません。進め方についてのアドバイスは必死です。誰かが「ああ、XYZを実行するだけでいい」と言うことは期待していませんが、この種の問題をデバッグする方法についてのポインタをいただければ幸いです。

1>d:\Dev\webapi.cpp : fatal error C1001: An internal error has occurred in the compiler.
1>(compiler file 'f:\dd\vctools\compiler\utc\src\p2\p2symtab.c', line 5905)
4

5 に答える 5

2

自分の質問に答えてそれを受け入れるのは少し気分が悪いですが、それは正しいことだと思います...少なくとも一時的には問題を解決しました。トリックは、プリコンパイル済みヘッダーを無効にしているようです。これで問題が解決する理由はわかりません。影響を受けたプロジェクトのビルド時間が 30 秒未満から 5 分近くに短縮されたことは非常に残念ですが、少なくとも先に進むことはできます...より恒久的な解決策があれば、彼らの回答を承認済みとしてマークできれば幸いです。

于 2009-06-24T15:28:45.840 に答える
1

p2symtab.cそれがシンボル テーブル コード (の一部) であると仮定するのは合理的な賭けです。これにより、アップグレードがどのようにそれを引き起こしたかがすぐに説明されます。このコードは書き直されました。(VC6 の 255 文字の長さの警告を覚えていますか?)

この場合、シンボル テーブルに新しいエントリがないため、シンボル テーブルのルックアップが見事に失敗している可能性があります。名前検索が発生するコンテキストが結果に影響するかどうかを確認することは興味深いでしょう。たとえば、コードを次のように変更するとどうなりますか

typedef SObjDict<RWCString, SIDataSource> SObjDict_RWCString_SIDataSource;
m_phDSAttributes = new SObjDict_RWCString_SIDataSource(&RWCString::hash);

これにより、別のシンボル テーブル エントリが強制的に作成されSObjDict_RWCString_SIDataSourceます。このエントリは、テンプレートのインスタンス化への一種のシンボリック リンクです。新しい名前は、単独で検索できます (そして検索する必要があります)。

于 2009-06-18T11:12:15.443 に答える
0

致命的なエラー C1001: コンパイラで内部エラーが発生しました。1>(コンパイラ ファイル 'f:\dd\vctools\compiler\utc\src\p2\p2symtab.c

vs 2005 のコードを vs 2008 にビルドしようとすると、同じエラーが発生しますが、VS 2008 のサービス パックをインストールしないと発生します...

サービスパックをインストールしましたか...これで問題が解決すると思います....

于 2009-06-21T03:23:22.017 に答える
0

それを小さなパーツに分解し始めます。私の最初の推測では、静的関数へのポインタが問題になるでしょう。コンストラクターで同じパラメーターを使用してダミーの非テンプレート クラスを作成できますか? テンプレートで抽象クラスを使用しない場合、コンパイルされますか?

私はあなたを間違った方向に送っているように見えます.2008年には次のようにコンパイルできます:

class thing {
public:
    static void hash( short sht ) {
    }

    void hash( long lng ) {
    }
};

class thing2 {
public:
    thing2( void (short ) ){}
};

int _tmain(int argc, _TCHAR* argv[])
{
    thing2* t = new thing2( &thing::hash );
    delete t;
    return 0;
}

ただし、コードがコンパイルされて問題の原因がわかるまで、複雑な要素を削除/置換するという原則は変わりません。

于 2009-06-17T19:54:22.860 に答える
-2

これは通常、テンプレートのインスタンス化で発生します。残念ながら、これは多くの原因で発生する可能性がありますが、99%の確率で、コードが未定義の動作を微妙に呼び出しています。

于 2009-06-17T19:51:09.823 に答える