首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::asio::ip::udp::socket创建-编译错误-调用boost::asio::ip::udp::socket(*my_io_service,server_endpoint);

boost::asio::ip::udp::socket创建-编译错误-调用boost::asio::ip::udp::socket(*my_io_service,server_endpoint);
EN

Stack Overflow用户
提问于 2018-05-15 10:35:26
回答 1查看 531关注 0票数 0

我在用boost.asio编译boost库时遇到了问题。

我正在尝试从我的类构造函数创建一个boost-udp套接字。我尝试了几个不同的东西来编译,但我仍然看到了问题。

有没有人对这个问题有所了解?有人能帮我纠正我正在犯的错误吗?

下面是我的类:

代码语言:javascript
复制
    class NetworkTestToolServer
    {
        private:
            boost::asio::io_service*       my_io_service;
            boost::asio::ip::udp::endpoint server_endpoint;
            boost::asio::ip::udp::socket   server_udp_socket;
            boost::asio::ip::udp::endpoint sender_endpoint;
            boost::asio::ip::udp::endpoint client_endpoint;
        public:
            NetworkTestToolServer(short port);
    };

这是我的构造函数,我正在使用(在server_udp_socket失败):

代码语言:javascript
复制
NetworkTestToolServer::NetworkTestToolServer(short port)
{
    my_io_service = new boost::asio::io_service();

    server_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(),
                                                     50002);

    server_udp_socket = boost::asio::ip::udp::socket(*my_io_service, 
                                                     server_endpoint);
}

我看到以下错误:

代码语言:javascript
复制
user2@user2-VirtualBox:~/network_test_tool/network-test-tool/build$ make
[ 20%] Built target gmock_main
[ 35%] Built target gmock
[ 45%] Built target gtest
[ 55%] Built target gtest_main
Scanning dependencies of target network-test-tool-lib
[ 60%] Building CXX object app/CMakeFiles/network-test-tool-lib.dir/src/ntt/NetworkTestToolServer.cpp.o                                                                                         
/home/user2/network_test_tool/network-test-tool/app/src/ntt/NetworkTestToolServer.cpp: In constructor ‘ntt::NetworkTestToolServer::NetworkTestToolServer(short int)’:
/home/user2/network_test_tool/network-test-tool/app/src/ntt/NetworkTestToolServer.cpp:34:56: error: no matching function for call to ‘boost::asio::basic_datagram_socket<boost::asio::ip::udp>::basic_datagram_socket()’
 NetworkTestToolServer::NetworkTestToolServer(short port)
                                                        ^
In file included from /usr/include/boost/asio.hpp:21:0,
                 from /home/user2/network_test_tool/network-test-tool/app/src/ntt/NetworkTestToolServer.cpp:3:
/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<Protocol1, Protocol>::value>::type*)
   basic_datagram_socket(
   ^~~~~~~~~~~~~~~~~~~~~
/usr/include/boost/asio/basic_datagram_socket.hpp:183:3: note:   template argument deduction/substitution failed:
/home/user2/network_test_tool/network-test-tool/app/src/ntt/NetworkTestToolServer.cpp:34:56: note:   candidate expects 2 arguments, 0 provided
 NetworkTestToolServer::NetworkTestToolServer(short port)
                                                        ^
In file included from /usr/include/boost/asio.hpp:21:0,
                 from /home/user2/network_test_tool/network-test-tool/app/src/ntt/NetworkTestToolServer.cpp:3:
/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
app/CMakeFiles/network-test-tool-lib.dir/build.make:110: recipe for target 'app/CMakeFiles/network-test-tool-lib.dir/src/ntt/NetworkTestToolServer.cpp.o' failed
make[2]: *** [app/CMakeFiles/network-test-tool-lib.dir/src/ntt/NetworkTestToolServer.cpp.o] Error 1
CMakeFiles/Makefile2:1228: recipe for target 'app/CMakeFiles/network-test-tool-lib.dir/all' failed
make[1]: *** [app/CMakeFiles/network-test-tool-lib.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2
user2@user2-VirtualBox:~/network_test_tool/network-test-tool/build$ 
EN

回答 1

Stack Overflow用户

发布于 2018-05-15 20:25:07

https://www.boost.org/doc/libs/1_67_0/doc/html/boost_asio/reference/basic_datagram_socket/basic_datagram_socket.html

udp::socket没有默认的构造函数。你的构造函数是,

代码语言:javascript
复制
NetworkTestToolServer::NetworkTestToolServer(short port)
{
    my_io_service = new boost::asio::io_service();

    server_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(),
                                                     50002);

    server_udp_socket = boost::asio::ip::udp::socket(*my_io_service, 
                                                     server_endpoint);
}

这是一种非常糟糕的编写构造函数的方式。构造函数将为类中的每个成员调用默认构造函数。在您的例子中,udp::socket没有默认的构造函数。这就是它无法编译的原因。只有在默认构造之后,大括号块中的语句才会被执行。您需要的是member initializer list。有关更多参考信息,请参阅此stackoverflow question

你想要的是这样的东西,

代码语言:javascript
复制
class NetworkTestToolServer
{
    using udp = boost::asio::ip::udp;
    private:
        boost::asio::io_service*       my_io_service;
        udp::endpoint server_endpoint;
        udp::socket   server_udp_socket;
        udp::endpoint sender_endpoint;
        udp::endpoint client_endpoint;
    public:
        NetworkTestToolServer(short port);
};

NetworkTestToolServer::NetworkTestToolServer(short port)
  : my_io_service(new boost::asio::io_service),
    server_endpoint(udp::endpoint(udp::v4(), port)),
    server_udp_socket(udp::socket(*my_io_service, server_endpoint))
{
}

不幸的是,gcc没有生成非常好的错误代码。clang给出了更好的错误,

代码语言:javascript
复制
udp_bad.cpp:15:24: error: constructor for 'NetworkTestToolServer' must explicitly initialize the member 'server_udp_socket' which does not have a default constructor
NetworkTestToolServer::NetworkTestToolServer(short port)

下次尝试多个编译器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50341533

复制
相关文章

相似问题

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