VS 2010 Ultimate を使用しています。ツールセット v90。
DLL と、DLL に静的にリンクするテスト プロジェクトがあります。DLL 内には、IFilter と呼ばれるエクスポートされるクラスがあります。このインターフェイス クラスは名前空間内にラップされます。このクラスの使用法は名前空間を使用して明示的に記述されます。たとえば、void DoSomethingWithDLLTypes( const Observer::IFilter &);
何ヶ月もの間、すべてが正常に機能していましたが、DLL プロジェクト以外の最近の変更により、新しいファイルを取り込み始めました。これらのファイルをソリューションに追加し、テストに追加するたびに再構築すると、すべてが正常に機能し、突然このエラーが発生しました。
C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\Filter.h(53): 警告 C4099: 'Observer::IFilter': 'class' を使用して最初に検出された型名が、'struct' を使用して検出されました d: \proj\pub\h\IFilter.h(12) : 'Observer::IFilter' の宣言を参照してください C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\Filter.h(183): エラー C2371: 'IFilter': 再定義; さまざまな基本型 C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\Filter.h(53) : 「IFilter」の宣言を参照
もともと IFilter は名前空間にラップされていなかったため、すべてのファイルを調べて (これで解決すると考えて)、すべてを名前空間にラップする必要がありました。これで、DLL は正常にコンパイルされますが、テスト プロジェクトでも同じエラーが発生します。MS SDK の IFilter/Filter.h がどのように/なぜ含まれているのかさえわかりません。
Test プロジェクトはプリコンパイル済みヘッダーを使用していますが、Windows.h を使用していません。どちらにしても、「念のために」そこに #define lean_and_mean マクロを実行しましたが、何の役にも立ちませんでした。