1

我正在使用库 websocketcpp 和 boost 1.71。该代码用于 boost 1.58,但在升级两个库后,它不会编译。C++编译器为g++(Ubuntu 9.3.0-17ubuntu1~20.04)9.3.0,代码如下:

using boost::property_tree::ptree;
using boost::property_tree::read_json;
using boost::property_tree::write_json;

using websocketpp::connection_hdl;
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;
//.......
{
    srv.init_asio();
    srv.set_reuse_addr(true);
    srv.set_open_handler(bind(&WsServer::on_open, this, websocketpp::lib::placeholders::_1));
    srv.set_close_handler(bind(&WsServer::on_close, this, websocketpp::lib::placeholders::_1));
    srv.set_message_handler(bind(&WsServer::on_message, this, websocketpp::lib::placeholders::_1, websocketpp::lib::placeholders::_2));
}

我使用#define BOOST_BIND_NO_PLACEHOLDERS. 但是,这将给出以下错误:

/usr/include/boost/bind/bind.hpp:319:35: error: no match for call to ‘(boost::_mfi::mf1<void, boost::property_tree::json_parser::detail::standard_callbacks<boost::property_tree::basic_ptree<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >, char>) (
boost::property_tree::json_parser::detail::standard_callbacks<boost::property_tree::basic_ptree<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >&, std::_Placeholder<1>&)’
  319 |         unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]);
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//...
/usr/include/boost/bind/mem_fn_template.hpp:176:25: note:   template argument deduction/substitution failed:

usr/include/boost/bind/mem_fn_template.hpp:184:7: note: candidate: ‘R boost::_mfi::mf1<R, T, A1>::operator()(T&, A1) const [with R = void; T = boost::property_tree::json_parser::detail::standard_callbacks<boost::property_tree::basic_ptree<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >; A1 = char]’
  184 |     R operator()(T & t, A1 a1) const
      |       ^~~~~~~~
/usr/include/boost/bind/mem_fn_template.hpp:184:28: note:   no known conversion for argument 2 from ‘std::_Placeholder<1>’ to ‘char’
  184 |     R operator()(T & t, A1 a1) const
4

1 回答 1

1

就像大家说的,不要using namespace

此外,您应该避免使用更新的 boost BOOST_BIND_GLOBAL_PLACEHOLDERS,而不是<boost/bind.hpp>include <boost/bind/bind.hpp>(默认情况下不再这样做。

这是您看到的冲突的根源,因为property_tree使用了 boost 绑定(如错误消息所示)。

完全不相关:不要(ab)使用 PropertyTree,就好像它是一个 JSON 库一样。而是使用 Boost JSON 或其他一些 JSON 库。


此外,无关的,你不需要所有的usings 反正。您已经可以使用 ADL 来减少输入:

#include <boost/property_tree/json_parser.hpp>
#include <iostream>

int main()
{
    boost::property_tree::ptree pt;
    std::istringstream str(R"({"hello":"world"})");
    read_json(str, pt);
    write_json(std::cout, pt);
}

观看Coliru 直播

于 2021-10-22T14:20:34.163 回答