hi,
i have trouble to define a static member in a template, and i search from google, but didn't find any similar case, my case is a little complex, i paste the code below.
code in xxx.h
Code:
template <class T> class FreeListManager
{
public:
FreeListManager(int s=0);
~FreeListManager();
T* acquire();
void release(T*);
protected:
static list<T*> freeList;
static list<T*> usedList;
// We have size parameters separated from list, since
// size() function of list container is inefficient.
};
code in xxx.cpp
Code:
include "xxx.h"
template<class T> list<T*>
FreeListMaager<T>::freeList;
template<class T> list<T*>
FreeListManager<T>::usedList;
//there is no T defined
for the xxx.cpp file, actually, it is confused me a lot, and it seem to be not what i want, what is the type of the entry in freeList like after above definition? i got coredump when use the freeList.pushback. and i ever tried to define the two list static member like
Code:
template<class CLASSA> list<CLASSA*>
FreeListManager<CLASSA>::freeList;
template<class CLASSA> list<CLASSA*>
FreeListManager<CLASSA>::usedList;
template<class CLASSB> list<CLASSB*>
FreeListManager<CLASSB>::freeList;
template<class CLASSB> list<CLASSB*>
FreeListManager<CLASSB>::usedList;
i got redefinition for freeList and usedList error.
i was told FreeListManager<CLASSA> and FreeListManager<CLASSB> are totally two different class, why does the redefinition error come out?
i also try
Code:
list<CLASSA*> FreeListManager<CLASSA>::freeList;
list<CLASSA*> FreeListManager<CLASSA>::usedList;
list<CLASSB*> FreeListManager<CLASSB>::freeList;
list<CLASSB*> FreeListManager<CLASSB>::usedList;
i got too few template-parameter-lists error, the code can be compiled on gcc earlier version,
he code was download from opendiameter project, it can be compiled by very old version gcc complier.
but i found it cannot compliled by gcc-4.1.2
As i know, FreeListManager is a only template, and FreeListManager<CLASSA> is actual class, and FreeListManager<CLASSB> is another one, i want to define two static list member for both class,FreeListManager<CLASSA>::freeList, FreeListManager<CLASSB>::freeList, so the two static member should be not one instance, but two. Just like what i tested
Code:
template <class T> class FreeListManager
{
public:
static int counter;
};
template <class T> int FreeListManager<T>::counter=0;
//the following definition will report redefinition error, either
//template <CLASSA> int FreeListManager<CLASSA>::counter=0;
//template <CLASSB> int FreeListManager<CLASSB>::counter=0;
//i thought the complier only can initial the two static member once, and you can set other value later.
FreeListManager<CLASSA>::counter=2
FreeListManager<CLASSB>::counter=3
main()
{
printf("FreeListManager<CLASSA>::counter=%d\n",FreeListManager<CLASSA>::counter);
printf("FreeListManager<CLASSB>::counter=%d\n",FreeListManager<CLASSB>::counter);
}
##########################
the result is
FreeListManager<CLASSA>::counter=2
FreeListManager<CLASSB>::counter=3
so it seem there are two static variable FreeListManager<CLASSA> and FreeListManager<CLASSB>
can someone help me, really appreciate your help.