У меня есть служба 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 определено в глобальном пространстве имен, но возможно ли содержать это определение — чтобы оно не загрязняло глобальное пространство имен — и у меня не возникло бы этого конфликта?
Если не считать переименования пространства имен или члена перечисления, единственное решение для этого заключается в том, чтобы обернуть содержимое сгенерированного заголовочного файла в пространство имен. Это не без подводных камней и в зависимости от того, как содержимое вашего файла MIDL может в конечном итоге вызвать несколько головных болей. Самым чистым способом, который я вижу, было бы создание файла заголовка прокси, который объявляет пространство имен, а затем включает созданный MIDL файл заголовка.
Gourmet.h
namespace MIDLStuff
{
#include "Gourmet_i.h"}
Если вы используете C ++ 11, вы можете использовать Scoped Enumeration, включив class
:
typedef enum class Food
{
Chocolate = 0,
Doughnut,
HotDog
} Food;
Теперь вам нужно написать Food:Chocolate
при использовании значения.