c++ - 在类成员函数内累积同一类的对象

标签 c++

我有以下类(class)。当我通过方法 1(已注释)计算 _avg_lifespan 时,它会编译,但是它不会使用 std:accumulate 使用方法 2 进行编译。为什么?

#include <vector>
#include <numeric>
#include <stdlib.h>
#include <functional>
#include <iostream>
using namespace std;

class Raven{
    public:
        Raven()
        {
            _lifespan = rand() % 15;
        }
        int sum_life(int sum, Raven *rhs)
        {       
            return sum + rhs->get_lifespan();   
        }
        void set_avg_lifespan(vector<Raven*> flock)
        {
            //Method 1 works :-)
            /*
            int sum = 0;
            vector<Raven*>::iterator it = flock.begin(); 
            while( it < flock.end() )
            {   
                sum += (*it++)->get_lifespan();
                cout << sum << endl;
            }
            _avg_lifespan = (float)sum/flock.size();
            */
            //Method 2 does not work :-(    
            _avg_lifespan = (float)std::accumulate(flock.begin(), flock.end(),0,sum_life)/flock.size();
        }
        int get_lifespan( ) { return _lifespan; }
        float get_avg_lifespan( ) { return _avg_lifespan; }
    private:
        int _lifespan;      
        float _avg_lifespan;
};

错误是:

argument of type ‘int (Raven::)(int, Raven*)’ does not 
match ‘int (Raven::*)(int, Raven*)’

最佳答案

你的问题是 Raven::sum_life 是一个成员函数。 值得庆幸的是,您可以使用 std::bind并将“this”作为第一个参数传递。 您的代码如下所示:

auto f = std::bind(&Raven::sum_life, this, std::placeholders::_1, std::placeholders::_2);
_avg_lifespan = (float)std::accumulate(flock.begin(), flock.end(),0,f)/flock.size();

关于c++ - 在类成员函数内累积同一类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17931317/

相关文章:

c++ - 没有合适的默认构造函数可用 - 迭代器?

c++ - 在 std::map 中存储结构实例

c++ - 什么是消除歧义的关键字模板?

c++ - 了解其他类(class)发生的事件

c++ - 使定义/包含生成的结构适应 boost::fusion

c++ - 使用 C++ 将数组的十六进制值打印为字符串

c++ - 将矩形 Qt 按钮更改为圆形

c++ - SSE2 : Double precision log function

c++ - 读取 boost::asio UDP 广播响应

c++ - 异构数组中的元素可以知道它是什么模板类型吗?