【问题标题】:error C2039: 'result_type' : is not a member of '`global namespace''错误 C2039:“result_type”:不是“全局命名空间”的成员
【发布时间】:2015-07-08 20:22:15
【问题描述】:

我的应用程序抛出此错误:

error C2039: 'result_type' : is not a member of '`global namespace''

对于此代码:

void handle_read_headers(const boost::system::error_code& err, RESTClient::response& resp)
{
    if (!err)
    {
        // Process the response headers.
        std::istream response_stream(&response_);
        std::string header;
        while (std::getline(response_stream, header) && header != "\r")
            std::cout << header << "\n";
        std::cout << "\n";

        // Write whatever content we already have to output.
        if (response_.size() > 0)
            std::cout << &response_;

        (&resp)->body = "Yehey!!!";

        // Start reading remaining data until EOF.
        boost::asio::async_read(socket_, response_,
        boost::asio::transfer_at_least(1),
        boost::bind(&client::handle_read_content, this,
        boost::asio::placeholders::error, boost::ref(resp)));

    }
    else
    {
        std::cout << "Error: " << err << "\n";
    }
}

“绑定”函数如下所示:

void handle_read_content(const boost::system::error_code& err, RESTClient::response& resp){}

我的代码有什么问题?

更新:

我能够通过这些更改编译代码

【问题讨论】:

  • 哪一行报错???
  • 是的,但是编译器还会告诉您在您的代码中的哪个模板的哪个实例化导致了这个错误。
  • 作为数据点:gcc 4.9 编译得很好。 Clang 3.5 也是如此
  • 附言。这不是递归调用。 “递归”调用将来自完成处理程序。所以它真的是顺序的

标签: c++ boost visual-studio-2013


【解决方案1】:

根据本文档页面,ReadHandler 需要获取和错误代码以及传输的字节数。

可能是 MSVC 在调用绑定表达式时对丢失的占位符更加挑剔/敏感。¹

尝试将占位符参数添加到绑定中:

// Start reading remaining data until EOF.
boost::asio::async_read(socket_, response_,
        boost::asio::transfer_at_least(1),
        boost::bind(&client::handle_read_content, this,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred,
            boost::ref(resp)));

显然也适用于处理函数本身:

void handle_read_content(const boost::system::error_code& ec, size_t bytes_transferred, RESTClient::response& resp){}

更新

我花费了不合理的努力(感谢@qballer、@nab 和其他实时提要!)在 Visual Studio 中重现此内容并得到了这个:

记录在案:那是

  • Win32
  • 提升 1_58_0
  • openssl-1.0.2c-i386-win32
  • Visual Studio 2013 更新 4

¹ 事实上,我有时注意到 Asio 使用 GCC(我的首选编译器)接受处理函数的签名略有不同。我一直想知道这是一个功能,还是一个错误?

【讨论】:

  • 即使只是添加 bytes_transferred 也会引发错误
  • FTR 这不是一个被“抛出”的错误(异常被抛出,这将是在运行时。你有一个编译错误)。如果您添加 SSCCE,我可能会使用 MSVC 来查看它
  • 好的,我会上传到 Github,毕竟这将是一个开源项目
  • 呃。我不确定这是否符合我对“小型独立”的定义:)
  • 这里只是一个小代码:bit.ly/1gnemqG 这是我在 'void handle_read_content' 中注释掉的工作版本,它应该接收导致一些错误的占位符参数
猜你喜欢
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多