0

我想创建两个枚举:DerivedBirdTypeBasicBirdType. BasicBirdType 有名为 BCT_* 的成员。DerivedBirdType 具有 BasicBirdType 中的所有成员,但具有不同的前缀 DCT_*,并且它也具有 BasicBirdType 中没有的成员。

例如,BasicBirdType 有两个成员,*BCT_waterfowl* 和 *BCT_loons*。DerivedBirdType 将拥有*DCT_waterfowl*、*DCT_loons* 和一个新成员*DCT_Obama*。

我有 3 个文件。Bird.h声明重用通用名称的枚举结构和令牌解析运算符。DerivedBirdType.h重用成员BasicBirdType.h并添加额外的成员。

现在的问题是BasicBirdType当我尝试获取 BCT_* 时没有成员“BCT_waterfowl”,而DerivedBirdType工作正常。

BasicBirdType bird1 = BasicBirdType::BCT_waterfowl; // enum `BasicBirdType` now has no member "BCT_waterfowl"
DerivedBirdType bird2 = DerivedBirdType::DCT_waterfowl; // works fine

鸟.h:

#pragma once
#define BASIC_BIRD_TYPE(type) BCT_##type,
#define DERIVED_BIRD_TYPE(type) DCT_##type,

namespace Bird
{
    enum DerivedBirdType
    {
        #include "DerivedBirdType.h"
        TotalDerivedBirdTypes
    };

    enum BasicBirdType
    {
        #include "BasicBirdType.h"
        TotalBasicBirdTypes
    };
}

DerivedBirdType.h:

#pragma once
#define BASIC_BIRD_TYPE(type) DERIVED_BIRD_TYPE(type)

#include "BasicBirdType.h"
DERIVED_BIRD_TYPE(Obama)

BasicBirdType.h:

#pragma once
BASIC_BIRD_TYPE(waterfowl)
BASIC_BIRD_TYPE(loons)
4

1 回答 1

2

您的问题是当您包含头文件“DerivedBirdType.h”时已经包含头文件“BasicBirdType.h”,因此当您在 Basic 枚举中包含 BasicBirdType 时,编译器会删除它,因为它已经包含在内

enum BasicBirdType
{
    #include "BasicBirdType.h"    // no effect, file already included
    TotalBasicBirdTypes
};

这就是除 TotalBasicBirdTypes 之外 BasicBirdType 枚举为空的原因

于 2013-06-20T06:04:47.450 回答