lib boost asio 1.47.0 在 basic_socket.hpp 文件中出现错误。

4
我在尝试编译以下代码时遇到了错误:
void        Server::accept(void)
{
    Network::ptr connection = Network::initialize(this->my_acceptor.get_io_service());
    this->my_acceptor.async_accept(connection->socket(), bind(&Server::endCmd, this, *connection, placeholders::error));
}

void        Server::endCmd(Network connection, const boost::system::error_code& error)
{
    if (!error)
        {
            std::cout << "success!" << std::endl;
            connection.start();
            this->accept();
        }
}

VC++ 2010告诉我以下错误:

Error   1   error C2248: 'boost::asio::basic_io_object<IoObjectService>::basic_io_object' : cannot access private member declared in class 'boost::asio::basic_io_object<IoObjectService>'

我知道这个错误出现在这一行,因为当我注释掉它时,错误消失了... 经过一些研究,可能是与套接字类有关,当我调用connection->getSocket()时,但这个函数返回一个套接字实例的引用:

tcp::socket& Network::socket(void)
{
    return (this->my_socket);
}

我在网上没有找到任何解决方案 :(

请问有人有想法吗?

2个回答

2

我也曾遇到这个问题,花了几个小时才弄清楚出了什么问题。我的情况如下:

  • A 类中包含一个 boost socket。A 类是作为 B 类的成员使用的。
  • B 类是一个指针,且不能复制。在 B 类中,成员 A 被声明为引用。

B 类中的原始代码如下:

std::bind(&A::a_member, a_instance)

问题已经通过使用a_instance的地址进行修复(当然):
std::bind(&A::a_member, &a_instance).

我没有注意到这一点,花了一段时间才解决了。希望这对其他人也有所帮助。


2

async_accept是您自己编写的吗?如果是,确保它接受socket的引用而不是按值传递。您收到的错误提示说您正在尝试进行复制构造,但复制构造函数被声明为私有(这是C++实施类不支持复制的方式)。


问题解决了!:它没有到达套接字,而是到了“连接”的指针。endCmd必须采用共享指向连接的指针。因此,她的新原型采用“Network :: ptr connection”,并且bind的第三个参数必须是连接的指针(而不是这个取消引用的指针)。 - Adrien A.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接