我有这样的结构:
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) {}
,我会收到类似的错误。
答案 0 :(得分:10)
std :: bind1st和std :: bind2nd不接受带引用参数的仿函数,因为它们本身形成对这些参数的引用。你可以
答案 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);
}