![](/img/trans.png)
[英]c++ boost 1.71 compile error C2061 syntax error: identifier 'L'
[英]C++ and boost 1.71 - error: reference to ‘_1’ is ambiguous
我正在使用库 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
进行了#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
就像大家说的,不要using namespace
。
此外,使用最近的 boost 你应该避免BOOST_BIND_GLOBAL_PLACEHOLDERS
,而不是<boost/bind.hpp>
包括<boost/bind/bind.hpp>
(默认情况下不再这样做。
这是您看到的冲突的根源,因为property_tree
使用 boost 绑定(如错误消息所示)。
完全不相关:不要 (ab) 使用 PropertyTree,就好像它是一个 JSON 库一样。 而是使用 Boost JSON 或其他一些 JSON 库。
此外,无关,无论如何您都不需要所有
using
。 您已经可以使用 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); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.