将bind1st用于通过引用获取参数的方法

时间:2011-10-19 14:14:29

标签: c++ visual-c++

我有这样的结构:

struct A {
    void i(int i) {}
    void s(string const &s) {}
};

现在我试试这个:

bind1st(mem_fun(&A::i), &a)(0);
bind1st(mem_fun(&A::s), &a)("");

第一行编译好,但第二行生成错误:

c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfunctional(299): error C2535: 'void std::binder1st<_Fn2>::operator ()(const std::basic_string<_Elem,_Traits,_Ax> &) const' : member function already defined or declared
          with
          [
              _Fn2=std::mem_fun1_t<void,A,const std::string &>,
              _Elem=char,
              _Traits=std::char_traits<char>,
              _Ax=std::allocator<char>
          ]
          c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfunctional(293) : see declaration of 'std::binder1st<_Fn2>::operator ()'
          with
          [
              _Fn2=std::mem_fun1_t<void,A,const std::string &>
          ]
          c:\work\sources\exception\test\exception\main.cpp(33) : see reference to class template instantiation 'std::binder1st<_Fn2>' being compiled
          with
          [
              _Fn2=std::mem_fun1_t<void,A,const std::string &>
          ]

可能是什么问题?我怎么能解决它?

修改

似乎任何引用参数都是个问题。因此,如果我将i方法更改为void i(int &i) {},我会收到类似的错误。

4 个答案:

答案 0 :(得分:10)

std :: bind1st和std :: bind2nd不接受带引用参数的仿函数,因为它们本身形成对这些参数的引用。你可以

  1. 使用指针作为函数输入而不是引用
  2. 使用boost :: bind
  3. 接受复制字符串的性能成本

答案 1 :(得分:6)

问题是库规范中的缺陷。

查看针对gcc的错误报告以及由此产生的讨论:Bug 37811 - bind1st fails on mem_fun with reference argument

C ++ 03缺乏构建完美绑定库的功能。此问题已在C ++ 11中修复,具有完美转发和std :: bind。

答案 2 :(得分:0)

看看这个post是否解释了模板参数的要求。 正如您已经假设对std :: string的引用是问题所在。它不是有效的模板参数。

答案 3 :(得分:0)

按指针更改引用

#include <functional>
#include <string>

struct A {
    void i(int i) {}
    void s(const std::string *s) {}
};


int main(void)
{
    A a;
    std::bind1st(std::mem_fun(&A::i), &a)(0);
    const std::string s("");
    std::bind1st(std::mem_fun(&A::s), &a)(&s);
}