当前位置:编程学习 > VC++ >>

在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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,