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

/********************************************************************
 file name : CLK.h
 author  :   Clark/陈泽丹
 created :   2011-11-10
 purpose :   时间触发器
 (把一个偏特化的模板类声明为另一个类的友元, 折腾了哥一个下午才想到-_-!)
 注意不可采用
 friend class CreateTrig<STimerTrig>;
 而是用
 friend typename CreateTrig<STimerTrig>;
 (解决了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<STimerTrig>
{  
public:
	BOOL operator()(CTrigger* pCTrigger, STimerTrig* pDate);
};  


class TimerTrig: public CTrigger ,public ITimerSink
{
public:
	TimerTrig(){ m_Test = 7; }
	virtual ~TimerTrig(){}
	
	//创建触发器实例
	template<class T>
	BOOL Create(T* pDate)
	{
		CreateTrig<T> createTrig;
		return createTrig(this, pDate);
	}

	//触发器触发时
	virtual void OnTrigger(){}

	//释放释放触发器
	virtual void Release();

private:
	// 定时器回调
	virtual void OnTimer(DWORD dwTimerID){}
	friend typename CreateTrig<STimerTrig>;
	int m_Test;
};


#endif //__TIMER_TRIG_H__


 

template<>
BOOL CreateTrig<STimerTrig>::operator()(CTrigger* pCTrigger, STimerTrig* pDate)
{
	CLK::Trace trace("STimerTrig类型!");
	TimerTrig* pTimerTrig = (TimerTrig*)pCTrigger;
	int k = pTimerTrig->m_Test;
	return TRUE;
}

 

//补充: 整个模板类的族作为友元-----------------------------
template<class T>
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<T>;
	int m_test;
};


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值