首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法编译boost::asio::basic_datagram_socket<boost::asio::ip::udp>::basic_datagram_socket()

无法编译boost::asio::basic_datagram_socket<boost::asio::ip::udp>::basic_datagram_socket()
EN

Stack Overflow用户
提问于 2018-01-16 15:13:12
回答 1查看 866关注 0票数 1

我正在尝试做一个合适的udpServer类,它将是我的udpServerBoost的父母。( udpServer没有实现atm)

由于我试图更改类构造函数,让它自己创建io_service,所以在编译src时出现了一个错误

代码语言:javascript
复制
src/UdpServerBoost.cpp: In constructor ‘UdpServerBoost::UdpServerBoost()’:
src/UdpServerBoost.cpp:44:32: error: no matching function for call to ‘boost::asio::basic_datagram_socket<boost::asio::ip::udp>::basic_datagram_socket()’
 UdpServerBoost::UdpServerBoost()
                                ^
In file included from /usr/include/boost/asio.hpp:21:0,
                 from src/UdpServerBoost.hpp:9,
                 from src/UdpServerBoost.cpp:1:
/usr/include/boost/asio/basic_datagram_socket.hpp:183:3: note: candidate: template<class Protocol1, class DatagramSocketService1> boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::basic_datagram_socket(boost::asio::basic_datagram_socket<Protocol1, DatagramSocketService1>&&, typename std::enable_if<std::is_convertible<_U1, _T1>::value>::type*)
   basic_datagram_socket(
   ^
/usr/include/boost/asio/basic_datagram_socket.hpp:183:3: note:   template argument deduction/substitution failed:
src/UdpServerBoost.cpp:44:32: note:   candidate expects 2 arguments, 0 provided
 UdpServerBoost::UdpServerBoost()
                                ^
In file included from /usr/include/boost/asio.hpp:21:0,
                 from src/UdpServerBoost.hpp:9,
                 from src/UdpServerBoost.cpp:1:
/usr/include/boost/asio/basic_datagram_socket.hpp:147:3: note: candidate: boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::basic_datagram_socket(boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>&&) [with Protocol = boost::asio::ip::udp; DatagramSocketService = boost::asio::datagram_socket_service<boost::asio::ip::udp>]
   basic_datagram_socket(basic_datagram_socket&& other)
   ^
/usr/include/boost/asio/basic_datagram_socket.hpp:147:3: note:   candidate expects 1 argument, 0 provided
/usr/include/boost/asio/basic_datagram_socket.hpp:129:3: note: candidate: boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::basic_datagram_socket(boost::asio::io_service&, const protocol_type&, const native_handle_type&) [with Protocol = boost::asio::ip::udp; DatagramSocketService = boost::asio::datagram_socket_service<boost::asio::ip::udp>; boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::protocol_type = boost::asio::ip::udp; boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::native_handle_type = int]
   basic_datagram_socket(boost::asio::io_service& io_service,
   ^
/usr/include/boost/asio/basic_datagram_socket.hpp:129:3: note:   candidate expects 3 arguments, 0 provided
/usr/include/boost/asio/basic_datagram_socket.hpp:108:3: note: candidate: boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::basic_datagram_socket(boost::asio::io_service&, const endpoint_type&) [with Protocol = boost::asio::ip::udp; DatagramSocketService = boost::asio::datagram_socket_service<boost::asio::ip::udp>; boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::endpoint_type = boost::asio::ip::basic_endpoint<boost::asio::ip::udp>]
   basic_datagram_socket(boost::asio::io_service& io_service,
   ^
/usr/include/boost/asio/basic_datagram_socket.hpp:108:3: note:   candidate expects 2 arguments, 0 provided
/usr/include/boost/asio/basic_datagram_socket.hpp:86:3: note: candidate: boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::basic_datagram_socket(boost::asio::io_service&, const protocol_type&) [with Protocol = boost::asio::ip::udp; DatagramSocketService = boost::asio::datagram_socket_service<boost::asio::ip::udp>; boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::protocol_type = boost::asio::ip::udp]
   basic_datagram_socket(boost::asio::io_service& io_service,
   ^
/usr/include/boost/asio/basic_datagram_socket.hpp:86:3: note:   candidate expects 2 arguments, 0 provided
/usr/include/boost/asio/basic_datagram_socket.hpp:69:12: note: candidate: boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::basic_datagram_socket(boost::asio::io_service&) [with Protocol = boost::asio::ip::udp; DatagramSocketService = boost::asio::datagram_socket_service<boost::asio::ip::udp>]
   explicit basic_datagram_socket(boost::asio::io_service& io_service)
            ^
/usr/include/boost/asio/basic_datagram_socket.hpp:69:12: note:   candidate expects 1 argument, 0 provided
src/UdpServerBoost.cpp:47:70: error: no matching function for call to ‘boost::asio::basic_datagram_socket<boost::asio::ip::udp>::basic_datagram_socket(boost::asio::io_service*, boost::asio::ip::udp::endpoint)’
     socket_ = udp::socket(&io_service, udp::endpoint(udp::v4(), 1300));
                                                                      ^
In file included from /usr/include/boost/asio.hpp:21:0,
                 from src/UdpServerBoost.hpp:9,
                 from src/UdpServerBoost.cpp:1:
/usr/include/boost/asio/basic_datagram_socket.hpp:183:3: note: candidate: template<class Protocol1, class DatagramSocketService1> boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::basic_datagram_socket(boost::asio::basic_datagram_socket<Protocol1, DatagramSocketService1>&&, typename std::enable_if<std::is_convertible<_U1, _T1>::value>::type*)
   basic_datagram_socket(
   ^
/usr/include/boost/asio/basic_datagram_socket.hpp:183:3: note:   template argument deduction/substitution failed:
src/UdpServerBoost.cpp:47:70: note:   mismatched types ‘boost::asio::basic_datagram_socket<Protocol1, DatagramSocketService1>’ and ‘boost::asio::io_service*’
     socket_ = udp::socket(&io_service, udp::endpoint(udp::v4(), 1300));
                                                                      ^
In file included from /usr/include/boost/asio.hpp:21:0,
                 from src/UdpServerBoost.hpp:9,
                 from src/UdpServerBoost.cpp:1:
/usr/include/boost/asio/basic_datagram_socket.hpp:147:3: note: candidate: boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::basic_datagram_socket(boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>&&) [with Protocol = boost::asio::ip::udp; DatagramSocketService = boost::asio::datagram_socket_service<boost::asio::ip::udp>]
   basic_datagram_socket(basic_datagram_socket&& other)
   ^
/usr/include/boost/asio/basic_datagram_socket.hpp:147:3: note:   candidate expects 1 argument, 2 provided
/usr/include/boost/asio/basic_datagram_socket.hpp:129:3: note: candidate: boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::basic_datagram_socket(boost::asio::io_service&, const protocol_type&, const native_handle_type&) [with Protocol = boost::asio::ip::udp; DatagramSocketService = boost::asio::datagram_socket_service<boost::asio::ip::udp>; boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::protocol_type = boost::asio::ip::udp; boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::native_handle_type = int]
   basic_datagram_socket(boost::asio::io_service& io_service,
   ^
/usr/include/boost/asio/basic_datagram_socket.hpp:129:3: note:   candidate expects 3 arguments, 2 provided
/usr/include/boost/asio/basic_datagram_socket.hpp:108:3: note: candidate: boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::basic_datagram_socket(boost::asio::io_service&, const endpoint_type&) [with Protocol = boost::asio::ip::udp; DatagramSocketService = boost::asio::datagram_socket_service<boost::asio::ip::udp>; boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::endpoint_type = boost::asio::ip::basic_endpoint<boost::asio::ip::udp>]
   basic_datagram_socket(boost::asio::io_service& io_service,
   ^
/usr/include/boost/asio/basic_datagram_socket.hpp:108:3: note:   no known conversion for argument 1 from ‘boost::asio::io_service*’ to ‘boost::asio::io_service&’
/usr/include/boost/asio/basic_datagram_socket.hpp:86:3: note: candidate: boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::basic_datagram_socket(boost::asio::io_service&, const protocol_type&) [with Protocol = boost::asio::ip::udp; DatagramSocketService = boost::asio::datagram_socket_service<boost::asio::ip::udp>; boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::protocol_type = boost::asio::ip::udp]
   basic_datagram_socket(boost::asio::io_service& io_service,
   ^
/usr/include/boost/asio/basic_datagram_socket.hpp:86:3: note:   no known conversion for argument 1 from ‘boost::asio::io_service*’ to ‘boost::asio::io_service&’
/usr/include/boost/asio/basic_datagram_socket.hpp:69:12: note: candidate: boost::asio::basic_datagram_socket<Protocol, DatagramSocketService>::basic_datagram_socket(boost::asio::io_service&) [with Protocol = boost::asio::ip::udp; DatagramSocketService = boost::asio::datagram_socket_service<boost::asio::ip::udp>]
   explicit basic_datagram_socket(boost::asio::io_service& io_service)
            ^
/usr/include/boost/asio/basic_datagram_socket.hpp:69:12: note:   candidate expects 1 argument, 2 provided

我已经用g++编译了boost库,它起了作用。所以我知道问题并不来自于此:

这就是我的线人!谢谢你的阅读^^

祝您今天愉快

这是我的udpServerBoost.cpp

代码语言:javascript
复制
UdpServerBoost::UdpServerBoost()
{
    boost::asio::io_service io_service;
    socket_ = udp::socket(&io_service, udp::endpoint(udp::v4(), 1300));

    memset(&recv_buffer_, 0, 2048);
    clientList_ = std::vector<ClientBoost>();
    startReceive();
    io_service.run();
}

.hpp

代码语言:javascript
复制
class UdpServerBoost
{
  public:
    UdpServerBoost();
    ~UdpServerBoost() {};

  private:
    void startReceive();

    void handleReceive(const boost::system::error_code &error,
                       std::size_t bytes_transferred);

    void handleSend(boost::shared_ptr<std::string> /*message*/,
                    const boost::system::error_code & /*error*/,
                    std::size_t /*bytes_transferred*/);

    ClientBoost getClient();

    void treatMessage(std::string mess);
    void sendToClient(ClientBoost client, std::string mess);

    std::vector<ClientBoost> clientList_;
    udp::socket socket_;
    udp::endpoint remote_endpoint_;
    boost::array<char, 2048> recv_buffer_;
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-16 15:21:05

你是默认的-构造套接字。这是不允许的您至少必须提供对其执行器(io_service)的引用。

试着做这样的事情:

代码语言:javascript
复制
class UdpServerBoost
{
  UdpServerBoost();

  boost::asio::io_service my_io_service_;
  udp::socket my_socket_;
};

UdpServerBoost::UdpServerBoost()
: my_io_service_()
, my_socket_(my_io_service_)
{
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48284374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档