首先,我有一个片段如下:
struct D
{
int sum;
D():sum(0){accum();}
void incre(int arg){sum+=arg;}
void accum()
{
int arr[]={1,2,3,4,5};
std::for_each(arr,arr+ sizeof(arr)/sizeof(int),
std::bind1st(std::mem_fun(&D::incre),this));
cout << sum <<endl;
}
};
int main()
{
D();
}
Run Code Online (Sandbox Code Playgroud)
它编译得正确.但是在我将成员函数更改incre为之后
void incre(int & arg){sum+=arg;}
Run Code Online (Sandbox Code Playgroud)
它产生了错误,比如
typename _Operation::result_type std::binder1st<_Operation>::operator()
(typename _Operation::second_argument_type&) const [with _Operation =
std::mem_fun1_t<void, D, int&>]’ cannot be overloaded
Run Code Online (Sandbox Code Playgroud)
你对发生了什么有什么想法吗?我会感激任何帮助.
发生的事情是bind1st和mem_fun 不能与所有平台上的引用一起使用.
你可以将它与boost :: bind一起使用
std::for_each( arr, arr + sizeof(arr)/sizeof(int),
boost::bind( &D::incre, this, _1 ) );
Run Code Online (Sandbox Code Playgroud)
并且看起来GNU已经确定以上是一个足够好的解决方法来将错误标记为"无法修复".
在您的情况下,您可以通过值传入.您也可以愉快地将指针传递给这些函数.
顺便说一句,你在做什么应该工作.
按值传递可能无法修复它,因为您正在调用非const成员函数.关于非const成员函数也存在问题.
你的另一种选择当然是使用std :: accumulate而不是std :: for_each,这适用于你正在运行你的集合生成某些东西的特殊情况.我通常喜欢使用累积的方式是:
Result r;
Result* binaryfunc( Result*, T value ); // returns the same pointer passed in
std::accumulate( coll.begin(), coll.end(), binaryfunc, &r );
Run Code Online (Sandbox Code Playgroud)
这避免了在每次迭代时复制"结果".这里不需要使用bind1st或mem_fun,因此如果您通过引用传递值,则不会出现问题.
| 归档时间: |
|
| 查看次数: |
392 次 |
| 最近记录: |