gpt4 book ai didi

c++ - 为什么当我向作为 std::mem_fun() 参数的成员函数添加引用参数时编译错误?

转载 作者:太空狗 更新时间:2023-10-29 20:00:43 26 4
gpt4 key购买 nike

首先,我有一个片段如下:

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();
}

它编译正确。但是在我将成员函数 incre 更改为

之后
void incre(int &  arg){sum+=arg;}

它产生了错误,比如

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

你对正在发生的事情有什么想法吗?我将不胜感激。

最佳答案

发生的事情是 bind1st 和 mem_fun do not work with references on all platforms .

您可以将它与 boost::bind 一起使用

std::for_each( arr, arr + sizeof(arr)/sizeof(int), 
boost::bind( &D::incre, this, _1 ) );

似乎 GNU 已经决定上述是一个足够好的解决方法来将错误标记为“不会修复”。

在您的情况下,您可以按值传递。您也可以愉快地将指针传递给这些函数。

顺便说一句,你正在做的应该有用。

按值传递可能也无法解决问题,因为您正在调用非常量成员函数。关于 non-const member functions 也有一个问题.

当然,您的另一种选择是使用 std::accumulate 而不是 std::for_each,这适用于您正在运行您的集合生成某些东西的特定情况。我通常更喜欢使用 accumulate 的方式是:

Result r;
Result* binaryfunc( Result*, T value ); // returns the same pointer passed in
std::accumulate( coll.begin(), coll.end(), binaryfunc, &r );

这避免了在每次迭代时复制“结果”。此处无需使用 bind1st 或 mem_fun,因此如果您通过引用传递值也没有问题。

关于c++ - 为什么当我向作为 std::mem_fun() 参数的成员函数添加引用参数时编译错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5349973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com