【问题标题】:boost::function in VS2010 : error C2039: 'function' : is not a member of 'boost'VS2010 中的 boost::function : 错误 C2039: 'function' : is not a member of 'boost'
【发布时间】:2011-11-17 16:35:22
【问题描述】:

信息

我想使用 boost::function 将回调作为参数传递,像这样:

void ReadPacket(
        boost::function<void (const boost::system::error_code&, Packet* p)> callback);

然后使用它:

ReadPacket(boost::bind(
    &ServerSession::storePacket,
    this,
    _1,
    _2
    ));

毕竟在我调用了一系列回调之后

callback(ec, packet);

问题

我刚刚在 Debug 中编译了解决方案,一切看起来 OK ...

但是在Release中我遇到了很多上面提到的错误

BasicSession.h(30): error C2039: 'function' : is not a member of 'boost'
BasicSession.h(30): error C2061: syntax error : identifier 'function'
BasicSession.h(30): error C2059: syntax error : ')'
BasicSession.h(30): error C2143: syntax error : missing ')' before ';'

我感到困惑和失望。

建议

我发现boost::function 中有不同的语法。例如boost::function0boost::function1。这是因为 VS2010 不支持某些东西(我不知道具体是什么)

我说的对吗?

我还需要使这个应用程序尽可能便携和跨平台。

提升 1.47 和 VS2010

【问题讨论】:

  • MSVC10 不支持可变参数模板。任何伪造可变参数行为(例如bind)的东西都必须在幕后使用一些肮脏的诡计。
  • @kerrekSB 所以......如果我想使用传递回调函数作为参数的方法,我应该怎么做。就像在 ASIO 中所做的那样。
  • 不知道,抱歉 :-) 听起来这是 MSVC 特有的问题。我相信有该编译器经验的人很快就会发布一些有用的东西!

标签: c++ visual-studio-2010 boost boost-function


【解决方案1】:

如果您错过了,这里是tutorial on boost 功能。如果您查看教程,它将列出“首选”和“便携式”语法。由于您希望代码具有可移植性,因此您可能希望选择后者。

【讨论】:

  • 谢谢。我已经找到了。这就是答案?只使用function1?
  • 但该教程说 Visual C++ 7.1 及更高版本确实支持“首选”语法。
  • @ruakh 同意你的看法。同样奇怪的是,上面的代码确实在 Degug 中编译但不在 Release 中
【解决方案2】:

解决方案是boost::function4

【讨论】:

  • Welcome on SO :) 一般来说,我们希望答案不仅能提供解决方案,还能解释问题所在。这可能意味着冗长的答案......但这就是让人们自我教育的原因,这样他们下次就不会需要了。
  • @RomanKr 我喜欢这个简短的回答,但是,1. 为什么它在 VS2010 的 Debug 中编译而不在 Release 中编译。并说:教程说 Visual C++ 7.1 及更高版本确实支持“首选”语法。有什么意义???
  • 现在使用 boost::functionX 对我有用。但是为什么MSVC在Debug中编译上述版本而不在Release中编译仍然是一个神秘的秘密。
  • @nix:您可能希望将此通知 Microsoft 并报告错误 :) 希望他们会回答您。
猜你喜欢
  • 1970-01-01
  • 2021-04-22
  • 2014-07-17
  • 2012-12-10
  • 2015-01-14
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
相关资源
最近更新 更多