使用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对象之前,我应该初始化任何对象吗?

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

编辑:经过一些额外的测试,我发现当我注释掉asio::ip::tcp::resolver::query query;asio::ip::tcp::socket socket;时,程序将再次编译。为什么?

最佳答案

Mikel F在评论中解决了这个问题。

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

MSVC不够聪明,无法具体地告诉我,我也没有足够的经验来知道。

关于c++ - Asio解析器不将io_service对象作为参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41273168/

10-11 22:44
查看更多