gpt4 book ai didi

c++ - 用 boost::assign::map_list_of 填充 boost::function 的 std::map

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:42 25 4
gpt4 key购买 nike

我想创建一个键值数据结构,用于响应字符串匹配正则表达式模式的事件。所以我正在尝试使用 Boost 库来解决这个问题:

#include <boost/regex.hpp>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/assign.hpp>
#include <map>

typedef std::map<boost::regex, boost::function<void(void)> > regex_callback;

void SuOpenedCallback()
{
}

void SuClosedCallback()
{
}


int main(int argc, char** argv)
{
//Don't pay attention to these definitions...
boost::regex su_opened ("^(\\w+)\\s(\\d+)\\s([\\d:]+)\\s(\\w+)\\s"
"su: pam_unix\\(su:session\\): session opened for user{1}\\s([\\w\\d]+)\\sby{1}\\s([\\w\\d]+)\\(uid=([\\d]+)\\)$");
boost::regex su_closed ("^(\\w+)\\s(\\d+)\\s([\\d:]+)\\s(\\w+)\\s"
"su: pam_unix\\(su:session\\): session closed for user{1}\\s([\\w\\d]+)$");

//Compilation error:
regex_callback resolver = boost::assign::map_list_of<boost::regex, boost::function<void(void)> >
(su_opened, boost::bind(&SuOpenedCallback))
(su_closed, boost::bind(&SuClosedCallback));

//...

}

当我尝试编译它时(不幸的是我不得不使用相当老的软件 - gcc 4.4.7,boost 1.41,因此 C++11 支持非常有限):

 g++ boost_regexp.cpp -o test -lboost_regex -std=c++0x

编译失败并出现此错误:

boost_regexp.cpp: In function ‘int main(int, char**)’:
boost_regexp.cpp:58: error: ambiguous overload for ‘operator=’ in
‘resolver = boost::assign::map_list_of(const Key&, const T&) [with Key
= boost::regex, T = boost::_bi::bind_t<void, void (*)(), boost::_bi::list0>](((const boost::_bi::bind_t<void, void (*)(),
boost::_bi::list0>&)((const boost::_bi::bind_t<void, void (*)(),
boost::_bi::list0>*)(& boost::bind [with R =
void](SuOpenedCallback))))).boost::assign_detail::generic_list<T>::operator()
[with U = boost::regex, U0 = boost::_bi::bind_t<void, void (*)(),
boost::_bi::list0>, T = std::pair<boost::basic_regex<char,
boost::regex_traits<char, boost::cpp_regex_traits<char>,
boost::_bi::bind_t<void, void (*)(), boost::_bi::list0>](((const
boost::regex&)((const boost::regex*)(& su_closed))), ((const
boost::_bi::bind_t<void, void (*)(), boost::_bi::list0>&)((const
boost::_bi::bind_t<void, void (*)(), boost::_bi::list0>*)(&
boost::bind [with R = void](SuClosedCallback)))))’
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_map.h:251:
note: candidates are: std::map<_Key, _Tp, _Compare, _Alloc>&
std::map<_Key, _Tp, _Compare, _Alloc>::operator=(const std::map<_Key,
_Tp, _Compare, _Alloc>&) [with _Key = boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char>, _Tp =
boost::function<void()>, _Compare = std::less<boost::basic_regex<char,
boost::regex_traits<char, boost::cpp_regex_traits<char>, _Alloc
= std::allocator<std::pair<const boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char>,
boost::function<void()>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_map.h:266:
note: std::map<_Key, _Tp, _Compare, _Alloc>&
std::map<_Key, _Tp, _Compare, _Alloc>::operator=(std::map<_Key, _Tp,
_Compare, _Alloc>&&) [with _Key = boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char>, _Tp =
boost::function<void()>, _Compare = std::less<boost::basic_regex<char,
boost::regex_traits<char, boost::cpp_regex_traits<char>, _Alloc
= std::allocator<std::pair<const boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char>,
boost::function<void()>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_map.h:286:
note: std::map<_Key, _Tp, _Compare, _Alloc>&
std::map<_Key, _Tp, _Compare,
_Alloc>::operator=(std::initializer_list<std::pair<const _Key, _Tp>) [with _Key = boost::basic_regex<char, boost::regex_traits<char,
boost::cpp_regex_traits<char>, _Tp = boost::function<void()>,
_Compare = std::less<boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char>, _Alloc
= std::allocator<std::pair<const boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char>,
boost::function<void()>] make: *** [all] Error 1

似乎我的问题接近this one但是,它并没有激发我的灵感。如果有人能告诉我错误,那就太好了。

ANSWER 正如@sehe 所提到的,此代码对于最新版本的 gcc 是正确的,但不能用 gcc 4.4 处理。不幸的是我。

最佳答案

我会说应该只是编译。

你可以尝试更直接的方法(没有绑定(bind)),这在编译器上可能(很多)更容易:

regex_callback resolver = boost::assign::map_list_of<boost::regex, boost::function<void(void)> >
(su_opened, &SuOpenedCallback)
(su_closed, &SuClosedCallback);

编辑 既然那没有用,试着让它更明确:

typedef boost::function<void(void)> Func;

regex_callback resolver = boost::assign::map_list_of<boost::regex, Func >
(su_opened, Func(boost::bind(&SuOpenedCallback)))
(su_closed, Func(boost::bind(&SuClosedCallback)));

// or:
regex_callback resolver = boost::assign::map_list_of<boost::regex, Func >
(su_opened, Func(&SuOpenedCallback))
(su_closed, Func(&SuClosedCallback));

关于c++ - 用 boost::assign::map_list_of 填充 boost::function 的 std::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22538143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com