请问下大神们,c++11 std::function的问题

swpu_zhang 2016-10-17 02:39:56
在windows上编译运行成功
在linux编译失败
#include <functional>
#include <map>
#include <iostream>


#define TASK_BIND(fun) (std::bind(&SELF_TYPE::fun, this, std::placeholders::_1))

template<typename MessageType>
class MessageHandle
{
public:
typedef int CMD_TYPE;


typedef MessageHandle<MessageType> SELF_TYPE;
MessageHandle()
{
register_cmd_handler(0, TASK_BIND(handle_cmd_unknown));
}
void handle_message(const MessageType& msg)
{
std::map<CMD_TYPE, std::function<void(const MessageType &msg)>>::iterator it = m_cmd_handler.find(msg.get_cmd_type());
if (it != m_cmd_handler.end())
{
it->second(msg);
}
else
{
handle_cmd_unknown(msg);
}
}
void register_cmd_handler(const CMD_TYPE& cmd, std::function<void(const MessageType &msg)> hander)
{
std::pair<std::map<CMD_TYPE, std::function<void(const MessageType &msg)>>::iterator, bool> ret = m_cmd_handler.insert(std::make_pair(cmd, hander));
if (!ret.second)
{
m_cmd_handler[cmd] = hander;
}
}
void handle_cmd_unknown(const MessageType& msg) { std::cout << "test\n"; }
private:
std::map<CMD_TYPE, std::function<void(const MessageType &msg)>> m_cmd_handler;
};

class ClientMessage
{
public:
int get_cmd_type() const { return 0; }
};

int main()
{

MessageHandle<ClientMessage> handle;
ClientMessage msg;
handle.handle_message(msg);
return 0;
}

In member function 'void MessageHandle<MessageType>::handle_message(const MessageType&)':
MessageHandle.h:22:3: error: need 'typename' before 'std::map<int, std::function<void(const MessageType&)> >::iterator' because 'std::map<int, std::function<void(const MessageType&)> >' is a dependent scope
std::map<CMD_TYPE, std::function<void(const MessageType &msg)>>::iterator it
^
MessageHandle.h:22:77: error: expected ';' before 'it'
ap<CMD_TYPE, std::function<void(const MessageType &msg)>>::iterator it = m_cmd_
^
MessageHandle.h:23:7: error: 'it' was not declared in this scope
if (it != m_cmd_handler.end())

怎么解决 谢谢
...全文
167 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
swpu_zhang 2016-10-17
  • 打赏
  • 举报
回复
谢谢各位大神们
paschen 版主 2016-10-17
  • 打赏
  • 举报
回复
http://en.cppreference.com/w/cpp/language/dependent_name
paschen 版主 2016-10-17
  • 打赏
  • 举报
回复
加上typename告知编译器该参数是一个类型名,而不是变量名
dustpg 2016-10-17
  • 打赏
  • 举报
回复
在引用一个嵌套类时候, 特别是模板中, 需要在前面加上typename.告知编译器这是一个类.
        typename std::map<CMD_TYPE, std::function<void(const MessageType &msg)>>::iterator it = m_cmd_handler.find(msg.get_cmd_type());

        std::pair<typename std::map<CMD_TYPE, std::function<void(const MessageType &msg)>>::iterator, bool> ret = m_cmd_handler.insert(std::make_pair(cmd, hander));

64,646

社区成员

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

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