gpt4 book ai didi

c++ - 全局范围枚举和命名空间冲突

转载 作者:行者123 更新时间:2023-11-30 01:59:30 25 4
gpt4 key购买 nike

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

最佳答案

除了重命名命名空间或枚举成员之外,唯一的解决方案是将生成的头文件的内容包装在命名空间中。这并非没有陷阱,并且根据 MIDL 文件内容的不同,它最终可能会引起一些麻烦。我能看到的最干净的方法是创建一个代理头文件来声明命名空间,然后包含 MIDL 生成的头文件。

Gourmet.h

namespace MIDLStuff
{
#include "Gourmet_i.h"
}

关于c++ - 全局范围枚举和命名空间冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16113290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com