将std :: bind2nd与引用一起使用

Nav*_*een 3 c++ stl

我有一个像这样的简单类:

class A
{
public:
    void f(const int& n)
    {
        std::cout<<"A::f()" << n <<"\n";
    }
};
Run Code Online (Sandbox Code Playgroud)

我试图像这样使用它:

std::vector<A> vec;
A a;
vec.push_back(a);
std::for_each(vec.begin(), vec.end(), std::bind2nd(std::mem_fun_ref(&A::f), 9));
Run Code Online (Sandbox Code Playgroud)

但是当我编译代码时,我在函数头文件中的某处得到以下错误:

错误C2529:'_ Right':对引用的引用是非法的

如果我删除参数f()中的引用,它编译正常.我该如何解决这个问题?我不想删除引用,因为在我的实际代码中复制对象是非常昂贵的.另外,我没有使用提升.

Pav*_*aev 5

抱歉,你不能轻易做到这一点.只考虑其中一个未涵盖的案例std::bind1ststd::bind2nd(有点像三参数函数等).Boost会有所帮助 - boost::bind透明地支持引用,也有boost::ref.

如果您的实现支持TR1 - 最新的g ++版本和VC++ 2008 SP1都可以 - 那么您可以使用std::tr1::bind,这大部分是相同的boost::bind,但是标准化的.