在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;
};
摘自 xiaodan007的专栏
补充:软件开发 , Vc ,