c++ 模板类 静态成员初始化问题

wozhishanggao9 2018-08-06 04:57:25

template<class MessageHandlerClass>
class TimerApp
{
//friend class TimerApp;
typedef void (MessageHandlerClass::*HandlerMethod)();

public:
static void AddTimer(int interval,MessageHandlerClass *handler);

private:
static int interval_;
static HandlerMethod handler_method_; //回调函数指针
static MessageHandlerClass* handler_; //调用对象
static void OnTimer();
};


template<class MessageHandlerClass> int TimerApp<MessageHandlerClass>::interval_ = 0;
template<class MessageHandlerClass> MessageHandlerClass * TimerApp<MessageHandlerClass>::handler_ = 0;


请问handler_method_如何在类外初始化
...全文
258 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
开心秋水 2018-08-07
  • 打赏
  • 举报
回复
template<class MessageHandlerClass> typename TimerApp<MessageHandlerClass>::HandlerMethod
TimerApp<MessageHandlerClass>::handler_method_ = nullptr;
sghcpt 2018-08-07
  • 打赏
  • 举报
回复
template<class MessageHandlerClass> typename MessageHandlerClass::HandlerMethod TimerApp<MessageHandlerClass>::handler_method_ = 0; ???????
AlbertS 2018-08-07
  • 打赏
  • 举报
回复
最后测试了一下,应该是

template<class MessageHandlerClass>
typename TimerApp<MessageHandlerClass>::HandlerMethod
TimerApp<MessageHandlerClass>::handler_method_ = 0;


完整的代码:
.h文件

class CMsgHdl
{
public:
int m;
public:
void handlemsg() {
printf("handle complete!\n");
}

};



template<class MessageHandlerClass>
class TimerApp
{
//friend class TimerApp;
typedef void (MessageHandlerClass::*HandlerMethod)();

public:
static void AddTimer(int interval,MessageHandlerClass *handler){
interval_ = interval;
handler_ = handler;
}
static void AddMethod(HandlerMethod method)
{
handler_method_ = method;
}
int GetInterval() {return interval_;}

void execute()
{
(handler_->*handler_method_)();
}


private:
static int interval_;
static HandlerMethod handler_method_; //回调函数指针
static MessageHandlerClass* handler_; //调用对象
static void OnTimer();
};


template<class MessageHandlerClass> int TimerApp<MessageHandlerClass>::interval_ = 0;
template<class MessageHandlerClass> MessageHandlerClass* TimerApp<MessageHandlerClass>::handler_ = 0;

// 错误
//template<class MessageHandlerClass> TimerApp<MessageHandlerClass>::HandlerMethod TimerApp<MessageHandlerClass>::handler_method_ = &TimerApp<MessageHandlerClass>::AddTimer;

// 未调用AddMethod时编译通过,调用之后无法通过编译
//template<class MessageHandlerClass> typename MessageHandlerClass::HandlerMethod TimerApp<MessageHandlerClass>::handler_method_ = 0;

// 编译通过
template<class MessageHandlerClass> typename TimerApp<MessageHandlerClass>::HandlerMethod TimerApp<MessageHandlerClass>::handler_method_ = 0;


.cpp文件

#include <stdio.h>
#include "templateStaticInit.h"


int main(int argc, char* argv[])
{
TimerApp<CMsgHdl> test;
printf("test.interval_ = %d\n", test.GetInterval());

CMsgHdl msgHdl;

TimerApp<CMsgHdl>::AddTimer(6, &msgHdl);
msgHdl.handlemsg();


TimerApp<CMsgHdl>::AddMethod(&CMsgHdl::handlemsg);

test.execute();


return 0;
}


输出
test.interval_ = 0
handle complete!
handle complete!
AlbertS 2018-08-07
  • 打赏
  • 举报
回复
template<class MessageHandlerClass> typename MessageHandlerClass::HandlerMethod TimerApp<MessageHandlerClass>::handler_method_ = nullptr;

感觉是这一个
CyberLogix 2018-08-06
  • 打赏
  • 举报
回复
TimerApp<MessageHandlerClass>::handler_method_ = &TimerApp<MessageHandlerClass>::AddTimer;
kbasm 2018-08-06
  • 打赏
  • 举报
回复
template<class MessageHandlerClass> TimerApp<MessageHandlerClass>::HandlerMethod TimerApp<MessageHandlerClass>::handler_method_ = &TimerApp<MessageHandlerClass>::AddTimer;
ChongQingJin28 2018-08-06
  • 打赏
  • 举报
回复
如果没有猜错的话 解决的方法应该是 “类成员指针的定义”

https://blog.csdn.net/u010126059/article/details/50768495

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧