全局范围枚举和名称空间冲突

时间:2013-04-19 20:50:57

标签: c++ com enums atl midl

我有一个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的枚举是在全局命名空间中定义的,但它是否可以包含这个定义 - 所以它不会污染全局命名空间 - 我不会有这种冲突?

2 个答案:

答案 0 :(得分:3)

没有重命名命名空间或枚举成员关于唯一的解决方案是将生成的头文件的内容包装在命名空间中。这不是没有陷阱,取决于MIDL文件的内容最终可能会引起一些麻烦。我能看到的最简洁的方法是创建一个代理头文件,声明命名空间然后包含MIDL生成的头文件。

Gourmet.h

namespace MIDLStuff
{
    #include "Gourmet_i.h"
}

答案 1 :(得分:1)

如果您使用的是C ++ 11,可以通过加入class来使用Scoped枚举:

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

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