在VC6里把偏特化后的模板类(或者整个模板类族)声明为另一个类的友元的方法

2014-11-23 21:25:05 · 作者: · 浏览: 76

/********************************************************************

file name : CLK.h

author : Clark/陈泽丹

created : 2011-11-10

purpose : 时间触发器

(把一个偏特化的模板类声明为另一个类的友元, 折腾了哥一个下午才想到-_-!)

注意不可采用

friend class CreateTrig;

而是用

friend typename CreateTrig;

(解决了has already been instantiated from the primary template问题)

*********************************************************************/

#ifndef __TIMER_TRIG_H__

#define __TIMER_TRIG_H__

#include "..\\Trigger.h"

#include "..\\..\\CLK.h"

template<>

class CreateTrig

{

public:

BOOL operator()(CTrigger* pCTrigger, STimerTrig* pDate);

};

class TimerTrig: public CTrigger ,public ITimerSink

{

public:

TimerTrig(){ m_Test = 7; }

virtual ~TimerTrig(){}

//创建触发器实例

template

BOOL Create(T* pDate)

{

CreateTrig createTrig;

return createTrig(this, pDate);

}

//触发器触发时

virtual void OnTrigger(){}

//释放释放触发器

virtual void Release();

private:

// 定时器回调

virtual void OnTimer(DWORD dwTimerID){}

friend typename CreateTrig;

int m_Test;

};

#endif //__TIMER_TRIG_H__

template<>

BOOL CreateTrig::operator()(CTrigger* pCTrigger, STimerTrig* pDate)

{

CLK::Trace trace("STimerTrig类型!");

TimerTrig* pTimerTrig = (TimerTrig*)pCTrigger;

int k = pTimerTrig->m_Test;

return TRUE;

}

//补充: 整个模板类的族作为友元-----------------------------

template

class TimerTrig: public CTrigger ,public ITimerSink

{

public:

TimerTrig(){ m_test = 7;}

virtual ~TimerTrig(){}

//触发器触发时

virtual void OnTrigger(){}

private:

// 定时器回调

virtual void OnTimer(DWORD dwTimerID){}

friend typename CreateTrig;

int m_test;

};

摘自 xiaodan007的专栏