Template class Compile problem

H

hyderabadblues

I have created a timer class which is a template, but when I tried to
to create an object , I am getting following compile time error

template<class T>class prefetcher_tclTimer
{
typedef tVoid (T::*PMEMFUNC)();

private:
T* m_poClient; // Pointer to calling class
PMEMFUNC m_pMemFunc;
tU32 _u32Timeout;
tU32 _u32TimerInterval;
static void vOnTimeout( tPVoid arg );
tclTrace *m_poTrace;

public:
// Public functions
// connstructor / destructor
prefetcher_tclTimer ( );
~prefetcher_tclTimer( );

tBool Create( tU32 u32TimerMSec, tU32 u32TimerIntervalMSec,
T* _poClient, PMEMFUNC _pMemFunc );
tBool bStart( );
tBool bReset( );
tBool bStop ( );
};

I have defined the function bStart as

tBool prefetcher_tclTimer::bStart( )
{
tS32 s32RetVal;

if( _phTimerHandle != INVALID_HANDLE )
{
m_poTrace->vInfo(" prefetcher_tclTimer::bStart "):

s32RetVal = s32TimerSetTime( _phTimerHandle, _u32Timeout,
_u32TimerInterval );
if( s32RetVal != OK )
{
m_poTrace->vInfo("prefetcher_tclTimer::bStart( ), Timer Set
Failed");
}
}
else
{
m_poTrace->vInfo("prefetcher_tclTimer::bStart( ), Invalid Timer
Handler");
s32RetVal = FALSE;
}
return (tBool)s32RetVal;
}

I am getting an error as when tried to to compile it, I am creating
the template object with parameter tclUsbDataBuffer

Error: L6218E: Undefined symbol
prefetcher_tclTimer<tclUsbDataBuffer>::bStart() (referred from
usbDataBuffer.o).
 
M

Mark

I have created a timer class which is a template, but when I tried to
to create an object , I am getting following compile time error

template<class T>class prefetcher_tclTimer
{
typedef tVoid (T::*PMEMFUNC)();

private:
T* m_poClient; // Pointer to calling class
PMEMFUNC m_pMemFunc;
tU32 _u32Timeout;
tU32 _u32TimerInterval;
static void vOnTimeout( tPVoid arg );
tclTrace *m_poTrace;

public:
// Public functions
// connstructor / destructor
prefetcher_tclTimer ( );
~prefetcher_tclTimer( );

tBool Create( tU32 u32TimerMSec, tU32 u32TimerIntervalMSec,
T* _poClient, PMEMFUNC _pMemFunc );
tBool bStart( );
tBool bReset( );
tBool bStop ( );

};

I have defined the function bStart as

tBool prefetcher_tclTimer::bStart( )
{
tS32 s32RetVal;

if( _phTimerHandle != INVALID_HANDLE )
{
m_poTrace->vInfo(" prefetcher_tclTimer::bStart "):

s32RetVal = s32TimerSetTime( _phTimerHandle, _u32Timeout,
_u32TimerInterval );
if( s32RetVal != OK )
{
m_poTrace->vInfo("prefetcher_tclTimer::bStart( ), Timer Set
Failed");
}
}
else
{
m_poTrace->vInfo("prefetcher_tclTimer::bStart( ), Invalid Timer
Handler");
s32RetVal = FALSE;
}
return (tBool)s32RetVal;

}

I am getting an error as when tried to to compile it, I am creating
the template object with parameter tclUsbDataBuffer

Error: L6218E: Undefined symbol
prefetcher_tclTimer<tclUsbDataBuffer>::bStart() (referred from
usbDataBuffer.o).

The simple answer is to put the entire function (including
definitions) in the .h file. There's a reason for this, but I'd
probably screw up the explanation quite horribly and you're better to
google it.
 
M

Mark

The simple answer is to put the entire function (including
definitions) in the .h file. There's a reason for this, but I'd
probably screw up the explanation quite horribly and you're better to
google it.

Actually, I'll give it a shot.

prefetcher_tclTimer<tclUsbDataBuffer>::bStart() is declared in
your .h file, but never defined (for tclUsbDataBuffer). When the
compiler sees prefetcher_tclTimer<tclUsbDataBuffer>::bStart() for the
first time, it needs to find the templated definition for it, and then
generate a function specifically for tclUsbDataBuffer. However, since
the compiler only has a declaration and not a definition at this
point, it can't do that.
 
H

hyderabadblues

Actually, I'll give it a shot.

prefetcher_tclTimer<tclUsbDataBuffer>::bStart() is declared in
your .h file, but never defined (for tclUsbDataBuffer). When the
compiler sees prefetcher_tclTimer<tclUsbDataBuffer>::bStart() for the
first time, it needs to find the templated definition for it, and then
generate a function specifically for tclUsbDataBuffer. However, since
the compiler only has a declaration and not a definition at this
point, it can't do that.

Thanks It solves my problem, But still i face problem one I have a
static function pointer which I intialize during template object
creation how should I declare the static function pointer

typedef tVoid (T::*PMEMFUNC)();
static PMEMFUNC m_pMemFunc;

//How should I declare m_pMemFunc because it is static.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,183
Messages
2,570,967
Members
47,516
Latest member
TobiasAxf

Latest Threads

Top