qui est le code:C++ C1061 d'erreur fatale avec un grand interrupteur, metaprogramming
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)
}
maintenant j'obtenir une fatale "erreur C1061: limite du compilateur: blocs imbriqués trop profondément" en ligne CASE_N (124)
quelqu'un peut s'il vous plaît dites-moi pourquoi cela arrive? En fait, la nidification ne devrait pas être plus profonde que 2, non?
Merci!
// edit: le constructeur a demandé (le constructeur fonctionne très bien sans cette fonction de commutation)
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;
};
... le même genre de spécialisation de modèle pour chaque type dans les énumérations ...
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){}
};
Vous pouvez indiquer la version exacte du compilateur. – sbi
Pouvons-nous voir le constructeur? –
désolé, comment puis-je comprendre cela? Je travaille avec Visual Studio 2008 Professional – Mat