使用宏时,错误枚举没有成员

error enum has no member when using macro

本文关键字:枚举 成员 错误      更新时间:2023-10-16

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

例如,BasicBirdType有两个成员,*BCT_waterfowl*和*BCT_loons*。和派生鸟类型将有*DCT_waterfowl*, *DCT_loons*和一个新成员*DCT_Obama*。

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

问题是BasicBirdType现在没有成员"BCT_waterfowl"当我试图获得BCT_*,而DerivedBirdType工作正常。

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

Bird.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)

你的问题是,头文件"BasicBirdType.h"已经包括当你包括头文件"DerivedBirdType.h",因此,当你包括BasicBirdType在基本枚举,编译器删除它,因为它已经包括

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

这就是除了TotalBasicBirdTypes

之外BasicBirdType enum为空的原因