Code Bye

问一下下们,c++11 std::function的问题

在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())
怎么解决 谢谢
解决方案

20

在引用一个嵌套类时候, 特别是模板中, 需要在前面加上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));

30

加上typename告知编译器该参数是一个类型名,而不是变量名

10

http://en.cppreference.com/w/cpp/language/dependent_name

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明问一下下们,c++11 std::function的问题