глобальный enum и конфликт пространства имен

У меня есть служба ATL COM, и в файле .IDL я объявил перечисление так:

В Gourmet.idl

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

Файл заголовка генерируется автоматически, создавая Gourmet_i.h.

В другом файле .CPP (давайте назовем его Decadence.cpp) того же проекта ATL COM, я #include Gourmet_i.h. Я реализовал класс в этом .CPP, и он находится под пространством имен «Шоколад».

Например, в 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 определено в глобальном пространстве имен, но возможно ли содержать это определение — чтобы оно не загрязняло глобальное пространство имен — и у меня не возникло бы этого конфликта?

0

Решение

Если не считать переименования пространства имен или члена перечисления, единственное решение для этого заключается в том, чтобы обернуть содержимое сгенерированного заголовочного файла в пространство имен. Это не без подводных камней и в зависимости от того, как содержимое вашего файла MIDL может в конечном итоге вызвать несколько головных болей. Самым чистым способом, который я вижу, было бы создание файла заголовка прокси, который объявляет пространство имен, а затем включает созданный MIDL файл заголовка.

Gourmet.h

namespace MIDLStuff
{
#include "Gourmet_i.h"}
2

Другие решения

Если вы используете C ++ 11, вы можете использовать Scoped Enumeration, включив class:

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

Теперь вам нужно написать Food:Chocolate при использовании значения.

1

По вопросам рекламы [email protected]