我有一个这样简单的课程:
class A
{
public:
void f(const int& n)
{
std::cout<<"A::f()" << n <<"\n";
}
};我试着像这样使用它:
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()中的引用,它就会编译得很好。我该怎么解决这个问题?我不想删除引用,因为在我的实际代码中,对象的复制非常昂贵。另外,我不使用助推。
发布于 2009-09-23 08:17:36
你不能那么容易,抱歉。就当它是std::bind1st和std::bind2nd没有涵盖的情况之一(有点像3-参数函数等)。Boost会有所帮助-- boost::bind透明地支持引用,还有boost::ref。
如果您的实现支持TR1 (最新的g++版本和VC++2008 SP1都支持),那么您可以使用std::tr1::bind,这在很大程度上与boost::bind相同,但标准化了。
发布于 2009-09-23 08:12:17
我不相信您可以将参数绑定到接受引用的方法。(在STL中没有,我认为boost版本可能会让你这么做,但我不确定)
你需要自己动手。
struct CallF
{
CallF(int const& data): m_data(data) {}
void operator()(A& val) const
{
val.f(m_data);
}
int const& m_data;
};像这样使用:
std::for_each(vec.begin(), vec.end(), CallF(9));发布于 2009-09-23 22:22:50
我也被同样的问题咬了。如果您查看C++标准,您会发现它实际上是一个“库缺陷”。符合标准的C++实现根本无法处理引用参数。mem_fun_ref返回一个具有嵌套类型的类的对象(
argument_type, first_argument_type, second_argument_type)引用不被删除的。bind1st和bind2nd被指定为带有引用的操作符()作为参数。如果argument_type已经是一个引用,这将无法编译。
一种解决方案可能是用自己的模板魔术替换memfunref,并删除嵌套argument_type类型的引用。
https://stackoverflow.com/questions/1464439
复制相似问题