【问题标题】:Boost protocol_type namespace提升协议类型命名空间
【发布时间】:2018-07-20 01:21:36
【问题描述】:

在 C++11 中工作让我觉得自己像个白痴。

我正在为 Boost Socket (boost::asio::ip::udp::socket) 编写一个简单的包装类。我正在包装 Socket 的函数之一,open()。它需要一个protocol_type。查看 Boost 标头,它的命名空间应该是 boost::asio::。我包含 boost/asio/basic_socket.hpp 只是为了更好地衡量,因为它包含“protocol_type”的具体定义。

gcc 说“命名空间‘boost::asio’中的‘protocol_type’没有命名类型”。我已经尝试了数十个标头和更多名称空间来解决它。这正是我所拥有的:

#include <boost/asio.hpp>
#include <boost/asio/basic_socket.hpp>

namespace sprocketa{

class BoostSocketWrapper {
public:
    /**
     * @brief Constructor that creates the Boost Socket
     *
     * @param ioService
     */
    BoostSocketWrapper(boost::asio::io_service& ioService);

    // with the exception of "virtual", this is the exact same signature as in the Boost Socket class
    virtual void open( const boost::asio::basic_socket::protocol_type & protocol = boost::asio::protocol_type() );

private:
    std::unique_ptr<boost::asio::ip::udp::socket> theSocket = nullptr;
};

}

有谁知道如何解决这个问题?

【问题讨论】:

    标签: c++11 boost boost-asio


    【解决方案1】:

    basic_socket 是一个类模板,它有两个参数,你必须定义它们:

    template <typename Protocol, typename SocketService>
    class basic_socket
      : public basic_io_object<SocketService>,
        public socket_base
    {
    public:
      /// The protocol type.
      typedef Protocol protocol_type;
    

    protocol_type 是您作为第一个模板参数传递的内容,例如boost::asio::ip::udp

    // with the exception of "virtual", this is the exact same signature as in the Boost Socket class
    virtual void open( const boost::asio::basic_socket<boost::asio::ip::udp,
        boost::asio::stream_socket_service<boost::asio::ip::udp> >::protocol_type & protocol =
        boost::asio::ip::udp::v4() );
    

    【讨论】:

    • 谢谢,rafix07。这让事情变得更清楚了。但是从你上面的例子中,我得到'stream_socket_service'不是'boost::asio'的成员,这很神奇,因为我可以直接查看stream_socket_service头文件并看到它在boost::asio命名空间中(实际上,我得到了很多错误;这只是第一个)。我包含的唯一头文件是 boost/asio.hpp 和 boost/asio/stream_socket_service.hpp。知道会发生什么吗?
    • @Frecklefoot 只需要一个标题#include &lt;boost/asio.hpp&gt;。你用的是哪个版本的boost?你能发布编译器错误吗?我猜其他错误是链接器错误,您需要添加库来链接您的应用程序。
    • 我得到的确切错误是‘stream_socket_service’不是‘boost::asio’的成员我在同一行得到第二个相同的错误。然后我得到:“模板参数的数量错误(2,应该是 1)” 用于同一行。我们正在链接到 Boost 库。这个项目中还有其他使用 Boost 的组件,它们编译得很好。我们使用的是 Boost 版本 1_66
    • @Frecklefoot Ups,我用 1.65.1 版本测试了本地,在 1.66 中有变化,将 open 方法声明更改为 virtual void open( const boost::asio::basic_socket&lt;boost::asio::ip::udp&gt;::protocol_type &amp; protocol = boost::asio::ip::udp::v4() ); 没有第二个模板参数。它可以工作,在 -> coliru 上进行了测试。 {coliru 有 1.66 增强版}
    • 查看其他地方的错误端点,我可以确定它想要的是:boost::asio::ip::basic_endpoint<:asio::ip::udp>::protocol_type 。我把它塞进了方法签名中,它起作用了。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    相关资源
    最近更新 更多