Asio解析器不将io_service对象作为参数

时间:2016-12-21 22:43:57

标签: c++ networking boost-asio

使用asio独立库时遇到了一些问题。我确信我的问题是愚蠢的,我已经忘记/忽视了,但我终生无法弄清楚它是什么。也许你可以帮助我。

根据asio文档,我应该能够通过asio::ip::tcp::resolver resolver(io);创建解析器对象,其中io是先前定义的asio::io_service对象。我在一个类中执行此操作并执行此操作我理解您必须使用类初始化列表。但是,这是我遇到问题的地方。我已经复制并粘贴了下面的代码,我相信我做得很好,但也许你可以告诉我。

#pragma once
#include <asio.hpp>

class asiostuff
{
private:

    asio::io_service io;

    asio::ip::tcp::resolver resolver;

    asio::ip::tcp::resolver::query query;

    asio::ip::tcp::socket socket;
public:
    asiostuff()
       : resolver(io)
    { //<---- red squiggly line says no default constructor exists

    }
};

现在,我认为我做得对,但是当我尝试构建它时,MSVC输出C2512错误(没有合适的默认构造函数)。当我做的时候

    asio::io_service io;

    asio::ip::tcp::resolver resolver(io);

在类之外,它编译得很好,这向我表明我可能正在做类初始化列表错误。在初始化asio::ip::tcp::resolver对象之前是否应该初始化任何对象?

作为参考,我在发布模式下使用MSVC 2015编译x64。

编辑经过一些额外的测试后,我发现当我评论asio::ip::tcp::resolver::query query;asio::ip::tcp::socket socket;时,程序会再次编译。为什么呢?

1 个答案:

答案 0 :(得分:2)

米克尔在评论中解决了这个问题。

查询没有默认构造函数,需要正确构造。

MSVC并不够聪明,不能告诉我具体而且我没有足够的经验知道。