全局作用域枚举和命名空间冲突
global scope enum and namespace conflict
我有一个atlcom服务,在.IDL文件中,我声明了一个enum,如下所示:
在Gourmet.idltypedef 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
相关文章:
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- C++ |匿名命名空间与命名空间 std 冲突
- 分解SWIG Python接口 - 容器会产生命名空间冲突
- 如何解决两个不使用命名空间的第三方库之间的类名冲突?
- 调用 ADL 时,表达式和命名空间之间是否会发生冲突
- 类名和枚举值之间的冲突:无需命名空间即可解析
- C++当命名空间、类名和命名空间::类名冲突时该怎么办
- C++ 中的命名空间冲突
- 避免与具有相同名称的两个类发生命名空间冲突
- 命名与多个命名空间冲突
- 命名空间中的类名冲突
- ctime std::命名空间冲突
- 如何避免 C 和 C++ 中的命名空间冲突
- C++ 当命名空间发生冲突时,为什么结构/类不与变量和函数发生冲突?
- 我收到void main()和使用命名空间std;之间的冲突;?我正在使用代码块
- 全局作用域枚举和命名空间冲突
- 如何解决c++中的命名空间冲突?
- 不明确的引用和命名空间(来自两个外部库的定义冲突)
- 命名空间,类成员ADL冲突
- 在c++中命名命名空间的最佳方法//当名称冲突时该怎么做