1

我有一个 ATL COM 服务,在 .IDL 文件中,我声明了一个枚举,如下所示:

在 Gourmet.idl

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

头文件会自动生成,创建 Gourmet_i.h。

在同一个 ATL COM 项目的另一个 .CPP 文件(我们称之为 Decadence.cpp)中,我 #include Gourmet_i.h。我在这个 .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 回答
1

如果您使用的是 C++11,则可以通过包括以下内容来使用 Scoped Enumeration class

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

现在您需要Food::Chocolate在使用该值时编写。

于 2013-04-19T22:48:23.477 回答