全局作用域枚举和命名空间冲突

global scope enum and namespace conflict

本文关键字:命名空间 冲突 枚举 作用域 全局      更新时间:2023-10-16

我有一个atlcom服务,在.IDL文件中,我声明了一个enum,如下所示:

在Gourmet.idl

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

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

在同一个ATL COM项目的另一个。cpp文件(我们就叫它Decadence.cpp)中,我#包含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的枚举是在全局命名空间中定义的,但是是否有可能包含这个定义——这样它就不会污染全局命名空间——并且我不会有这个冲突?

除了重命名命名空间或enum成员之外,唯一的解决方案是将生成的头文件的内容包装在命名空间中。这并非没有缺陷,并且取决于您的MIDL文件的内容如何,它最终可能会导致一些令人头痛的问题。我能看到的最干净的方法是创建一个代理头文件,该文件声明名称空间,然后包含MIDL生成的头文件。

Gourmet.h

namespace MIDLStuff
{
    #include "Gourmet_i.h"
}

如果您正在使用c++ 11,您可以通过包含class:

来使用范围枚举。
typedef enum class Food
{
    Chocolate = 0,
    Doughnut,
    HotDog
} Food;

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