对于boost :: ref没有匹配的调用错误,但是对于std :: ref没有

时间:2013-02-25 18:47:33

标签: c++ c++11 boost boost-ref

我编写了一些代码,使用仿函数和来自refbind的{​​{1}}和boost::模板来计算向量的元素数量(对于C + +11)名称空间。我正在使用std::#defineboost::命名空间之间切换。我正在使用boost版本1.53,我的编译命令是std::。我已经尝试使用gcc版本4.7.2和4.6.3,但我得到了相同的错误。

我有3个问题:

  1. 我不明白为示例2生成的错误。
  2. 是否可以通过切换名称空间来创建像这样的可移植代码?
  3. 是否有一个很好的参考资料详细描述了g++ test.cpp -std=c++11stdboost的{​​{1}}和bind版本之间的差异? (我看到了this个问题,但答案没有提到reffunction
  4. 谢谢!

    P.S。该示例只是说明了我的问题,我知道ref的{​​{1}}: - )

    function

2 个答案:

答案 0 :(得分:4)

示例2失败,因为boost::reference_wrapper没有member operator() which forwards the argument(s),与std::reference_wrapper不同。因此,它仅用于通过引用传递普通参数,而不是期望被调用的函数或函子。

示例3失败,因为Boost.Bind relies on a specific protocol to get the result type of the function or functor you pass,如果您使用没有显式返回类型的版本。如果传递指向函数的指针或指向成员函数的指针,则返回绑定器对象将嵌套result_type设置为所述PTF或PTMF的返回类型。如果你传递一个仿函数,它需要一个嵌套的result_type 另一方面,如果您的仿函数没有嵌套std::bind,则result_type根本就没有嵌套boost::bind

请注意,正如我所说,您可以向std::bindstd::for_each(vec.begin(), vec.end(), impl::bind<void>(impl::ref(f3), _1)); // ^^^^^^ 明确提供结果类型:

{{1}}

修复了示例并使其编译。

答案 1 :(得分:2)

std::ref相比,{p> boost::ref有一个主要优势:它提供了一个完美转发{/ 1}},它会将调用转发到其包含的引用。

operator()实际上无法做到这一点,因为它需要大量的重载。但是,为了实现这一点,boost::ref(以及其他一些类)都为boost::bind提供了特殊处理。