首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用std::bind2和引用

使用std::bind2和引用
EN

Stack Overflow用户
提问于 2009-09-23 07:21:31
回答 4查看 2.1K关注 0票数 3

我有一个这样简单的课程:

代码语言:javascript
复制
class A
{
public:
    void f(const int& n)
    {
        std::cout<<"A::f()" << n <<"\n";
    }
};

我试着像这样使用它:

代码语言:javascript
复制
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));

但是,当我编译代码时,在函数头文件中的某个地方会出现以下错误:

error C2529:'_Right‘:引用引用是非法的

如果删除参数f()中的引用,它就会编译得很好。我该怎么解决这个问题?我不想删除引用,因为在我的实际代码中,对象的复制非常昂贵。另外,我不使用助推。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-23 08:17:36

你不能那么容易,抱歉。就当它是std::bind1ststd::bind2nd没有涵盖的情况之一(有点像3-参数函数等)。Boost会有所帮助-- boost::bind透明地支持引用,还有boost::ref

如果您的实现支持TR1 (最新的g++版本和VC++2008 SP1都支持),那么您可以使用std::tr1::bind,这在很大程度上与boost::bind相同,但标准化了。

票数 5
EN

Stack Overflow用户

发布于 2009-09-23 08:12:17

我不相信您可以将参数绑定到接受引用的方法。(在STL中没有,我认为boost版本可能会让你这么做,但我不确定)

你需要自己动手。

代码语言:javascript
复制
struct CallF
{
    CallF(int const& data): m_data(data)    {}
    void operator()(A& val) const
    {
        val.f(m_data);
    }
    int const& m_data;
};

像这样使用:

代码语言:javascript
复制
    std::for_each(vec.begin(), vec.end(), CallF(9));
票数 2
EN

Stack Overflow用户

发布于 2009-09-23 22:22:50

我也被同样的问题咬了。如果您查看C++标准,您会发现它实际上是一个“库缺陷”。符合标准的C++实现根本无法处理引用参数。mem_fun_ref返回一个具有嵌套类型的类的对象(

代码语言:javascript
复制
argument_type, first_argument_type, second_argument_type

)引用不被删除的。bind1st和bind2nd被指定为带有引用的操作符()作为参数。如果argument_type已经是一个引用,这将无法编译。

一种解决方案可能是用自己的模板魔术替换memfunref,并删除嵌套argument_type类型的引用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1464439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档