gpt4 book ai didi

c++ fatal error C1061,带有大开关,元编程

转载 作者:搜寻专家 更新时间:2023-10-31 01:21:14 25 4
gpt4 key购买 nike

这是代码:

static inline void 
shrinkData(const vector<Data> &data, unsigned short shrinkType){
#define CASE_N(N) \
case(N): \
ptr = MemoryManager::requestMemory(n*sizeof(ShrinkData<N>)); \
for(int i=0; i<n; i++){ \
new(ptr) ShrinkData<N>(data[i]); \
ptr+=sizeof(ShrinkData<N>); \
} \
return;


int n = data.size();
char* ptr;

switch(shrinkType){
case(0):
return;
CASE_N(1)
CASE_N(2)
CASE_N(3)
....
CASE_N(255)
}

现在我在 CASE_N(124) 行收到致命的“错误 C1061:编译器限制: block 嵌套太深”

谁能告诉我为什么会这样?实际上嵌套不应该超过 2,不是吗?

谢谢!

//编辑:请求的构造函数(构造函数在没有这个开关函数的情况下工作得很好)

enum {//maximally 16 to fit in a unsigned short!
EID_POSITION = 1, //bit1
EID_T = 2, //bit2
EID_GEOMNORMAL = 4, //bit3
EID_NORMAL = 8, //bit4
EID_TANGENTS = 16, //bit5
EID_TEXCOORDS = 32, //bit6
EID_RAYDIR = 64, //bit7
EID_RECURSIONDEPTH = 128 //bit8
};



template<unsigned, unsigned>
struct IDataMember{
IDataMember(){}
IDataMember(const Data &iData){}
};


template<>
struct IDataMember<EID_POSITION, EID_POSITION>{
IDataMember(): position(Vector3(0,0,0)){}
IDataMember(const Data &iData):position(iData.position){}
Vector3 position;
};

...枚举中每种类型的相同类型的模板特化...

template<unsigned members>
struct ShrinkData
:public IDataMember<members & EID_POSITION, EID_POSITION>
,public IDataMember<members & EID_T, EID_T>
,public IDataMember<members & EID_GEOMNORMAL, EID_GEOMNORMAL>
,public IDataMember<members & EID_NORMAL, EID_NORMAL>
,public IDataMember<members & EID_TANGENTS, EID_TANGENTS>
,public IDataMember<members & EID_TEXCOORDS, EID_TEXCOORDS>
,public IDataMember<members & EID_RAYDIR, EID_RAYDIR>
,public IDataMember<members & EID_RECURSIONDEPTH, EID_RECURSIONDEPTH>
{
ShrinkData()
:IDataMember<members & EID_POSITION, EID_POSITION>()
,IDataMember<members & EID_T, EID_T>()
,IDataMember<members & EID_GEOMNORMAL, EID_GEOMNORMAL>()
,IDataMember<members & EID_NORMAL, EID_NORMAL>()
,IDataMember<members & EID_TANGENTS, EID_TANGENTS>()
,IDataMember<members & EID_TEXCOORDS, EID_TEXCOORDS>()
,IDataMember<members & EID_RAYDIR, EID_RAYDIR>()
,IDataMember<members & EID_RECURSIONDEPTH, EID_RECURSIONDEPTH>(){}


ShrinkData(const Data &iData)
:IDataMember<members & EID_POSITION, EID_POSITION>(iData)
,IDataMember<members & EID_T, EID_T>(iData)
,IDataMember<members & EID_GEOMNORMAL, EID_GEOMNORMAL>(iData)
,IDataMember<members & EID_NORMAL, EID_NORMAL>(iData)
,IDataMember<members & EID_TANGENTS, EID_TANGENTS>(iData)
,IDataMember<members & EID_TEXCOORDS, EID_TEXCOORDS>(iData)
,IDataMember<members & EID_RAYDIR, EID_RAYDIR>(iData)
,IDataMember<members & EID_RECURSIONDEPTH, EID_RECURSIONDEPTH>(iData){}

};

最佳答案

根据这个link编译器中有一个“功能”只允许有限数量的循环。从来没有发生在我身上。尝试将 ptr 初始化和以下 for 循环放在一个 block 中。另一种解决方案是创建覆盖整个代码段的模板函数,这样宏就变成了这样:

#define CASE_N(N) \
case(N): \
ptr = requestAndInitialize<N>(data); \
return;

关于c++ fatal error C1061,带有大开关,元编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4009923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com