2009-06-17 16 views
2

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

これらの行の両方には、いくつかの複雑なネストされたテンプレートがインスタンス化されています。また、抽象クラスをテンプレートパラメータの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) 
+2

あなたはまだMicrosoftに苦情を申し立てましたか?あなたのコードに何らかの問題があっても、バグはコンパイラにあります。そのため、あなたはその権限の範囲内にいます。とにかく、彼らのコンパイラチームは、おそらく問題が何であるかの最良のアイデアを持っています。 –

+0

@David:私たちはまだバグ報告をMSに送っていません。私たちに似た他のバグレポート(p2symtab.cファイルには明らかに多くのバグがあります)を見て、再現スクリプトに付属していないバグレポートは手に入れません。私のバグを単純なreproスクリプトに減らそうとする私の試みは失敗しました。 – rmeador

答えて

2

....私はVS 2008のサービスパックをインストールしていないまで起こる...

は、Service Packをインストールしている...私は、この意志はあなたの問題を解決すると思います自分自身の質問を受け入れ、それを受け入れるが、それは正しいことだと思う...私は少なくとも一時的に、私の問題を解決したプリクラブドヘッダーを無効にするように思われる。なぜ問題を解決し、影響を受けたプロジェクトのビルド時間が30秒未満から5分近くになってから非常に不幸ですが、少なくとも進歩することができます。誰かがより永続的な解決策を考え出すなら、彼らの答えをAcceptedとしてマークする。

-1

これは、通常、テンプレートのインスタンス化で発生します。残念なことに、それは多くのことによって引き起こされる可能性がありますが、コードが未定義の動作を微妙に呼び出す時間の99%です。

0

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

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; 
} 

原理は/削除するには、コンパイルしたコードを持ってまで、複雑な要素を交換し、あなたがよ、しかし依然として:

は私が間違った方向にあなたを送ってるよう、以下は2008年に罰金コンパイルルックス問題の原因を知る

+0

関数ポインタが問題であるということは、私が考慮しなかったものです。私は、RWCString内にhash()という2つの関数があることに気付きました。 1つは静的で、もう1つはメンバー関数です。彼らは異なる署名を持っています...私は手動でそれらを明確にするための方法は何ですか私はコンパイラをトリッピングしていないことを確認することができますか? – rmeador

+0

RWCStringを制御できる場合は、明らかに名前を変更してください。そうでない場合は、2つの同様の関数を持つダミークラスを作成して問題がないかどうかを確認してください。 RWCStringクラスをラップせず、元の静的関数を呼び出すhash2という1つの静的メンバー関数を持っていれば、あいまいさを解消するための関数ポインタ(関数ポインタにはシグニチャがあります) defintelyトリックを行うだろう。 – Patrick

1

p2symtab.cはシンボルテーブルコードの一部であると仮定するのが得策です。これにより、アップグレードによってどのように発生したかがすぐに説明されます。このコードは書き直されました。

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

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

にコードを変更した場合に何が起こるかこれはSObjDict_RWCString_SIDataSourceのために、作成する別のシンボルテーブルエントリを強制します。このエントリは、テンプレートインスタンス化へのシンボリックリンクの一種です。新しい名前はそれ自身で調べることができます(そして、そうする必要があります)。

+0

あなたの提案を実装しようとしましたが、結果は変更されませんでした。あなたの考えは健全で妥当と思われるので、それは本当に悪いことです。 – rmeador

0

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

私はvs 2008とvs 2005のコードをビルドしようとしたときと同じエラーが発生しました。私は私に答えを入れてやや悪い感じ

+0

私が知っている限り最新のサービスパック1をインストールしました。 – rmeador

関連する問題