不能将std :: ptr_fun与带参考的函数一起使用

时间:2014-12-03 18:09:31

标签: c++

不允许使用C ++ 11或Boost。

我正在尝试编译以下代码,但我遇到了问题。 std::ptr_fun似乎不喜欢参考的参数。

#include <algorithm>
#include <functional>
#include <vector>

struct Something
{
};

template<class T>
T Function(const T& x, int s)
{
    // blah blah
    return x;
}

int main()
{
    std::vector<Something> data(20);
    std::transform(data.begin(), data.end(), data.begin(), std::bind2nd(std::ptr_fun(Function<Something>), 8));
}

VS2013错误消息: 错误C2535:'Something std :: binder2nd&gt; :: operator()(const Something&amp;)const':已定义或声明的成员函数

但是如果我将Function中的参数更改为T x就可以了!

有没有办法在不修改Function的情况下方便地工作?

实例:

http://ideone.com/Eno7gF

http://ideone.com/kGmv7r

1 个答案:

答案 0 :(得分:2)

你不能这样做。这是std :: bind1st和std :: bind2nd的基本限制。问题是它定义了两个()运算符,其中一个已经有了const&amp;在上面。所以编译器看到两个相同的函数。它不会被修复,因为C ++ 11已经弃用了这些方法。

另见:

Using bind1st for a method that takes argument by reference

weird compiler error using bind2nd(): "member function already defined or declared" instead of "reference to reference"

Bind2nd issue with user-defined class