1

ATL COM サービスがあり、.IDL ファイルで次のように列挙型を宣言しました。

Gourmet.idl 内

typedef enum Food
{
    Chocolate = 0,
    Doughnut,
    HotDog
} Food;

ヘッダー ファイルが自動的に生成され、Gourmet_i.h が作成されます。

同じ ATL COM プロジェクトの別の .CPP ファイル (Decadence.cpp と呼びましょう) に、Gourmet_i.h を #include します。この .CPP にクラスを実装しました。これは名前空間「Chocolate」の下にあります。

Decadence.cpp の例:

#include "Gourmet_i.h"

namespace Chocolate {

// Constructor
void Decadence::Decadence() {}

// ... and so on

} // namespace Chocolate

コンパイルすると、Gourmet_i.h に関する次のエラーが表示されます。

error C2365: 'Chocolate': redefinition; previous definition was 'namespace'

これは、IDL の列挙型がグローバル名前空間で定義されているために発生することがわかりますが、この定義を含めることは可能であり、グローバル名前空間を汚染しないため、この競合は発生しませんか?

4

2 に答える 2

3

名前空間または列挙型メンバーの名前を変更する以外に、これに対する唯一の解決策は、生成されたヘッダー ファイルの内容を名前空間にラップすることです。これには落とし穴がないわけではなく、MIDL ファイルの内容によっては、最終的にいくつかの頭痛の種になる可能性があります。私が見ることができる最もクリーンな方法は、名前空間を宣言し、MIDL で生成されたヘッダー ファイルをインクルードするプロキシ ヘッダー ファイルを作成することです。

Gourmet.h

namespace MIDLStuff
{
    #include "Gourmet_i.h"
}
于 2013-04-19T21:08:13.493 に答える