Functor编译时错误

时间:2015-03-04 18:44:04

标签: c++ c++11 functor standard-library

我的代码 -

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;

#include "boost\numeric\ublas\matrix.hpp"

typedef boost::numeric::ublas::matrix<float> matrix;


class FillMat{  
public:
    FillMat(float valIn) : val(valIn){}
    float operator()(float in) {
        val = in + 1;
        return val;
    }
private:
    float val;
};

typedef boost::numeric::ublas::matrix<float> matrix;
int main(){
    matrix m1(10, 20);
    float init = 22.2;
    FillMat myFiller(init);

    generate(m1.begin2(), m1.begin2() + m1.size1()*m1.size2(), myFiller);


    return 0;
}

当我尝试编译代码时,出现以下编译时错误。

Error   3   error C2064: term does not evaluate to a function taking 0 arguments    

有人可以告诉我原因吗?

P.S。我添加了标题。我正在为2D数组使用Boost矩阵。

4 个答案:

答案 0 :(得分:2)

传递给std::generate的仿函数的签名必须采用零参数。

这在documentation中说明。

不幸的是,你没有告诉我们你想要做什么,所以我不能建议你修复。

答案 1 :(得分:2)

可能的解决方法是改变:

  float operator()(float in) {
        val = in + 1;
        return val;
    }

成:

   float operator()( void ) {
        float rv = val;
        val = val + 1.0;
        return rv;
    }

如果那样做你想要的,那就是问题......

答案 2 :(得分:2)

您正在寻找的功能是std::transform

std::transform(m1.begin2(),
               m1.begin2() + m1.size1() * m1.size2(),
               m1.begin2(),
               myFiller);

答案 3 :(得分:1)

根据评论中的澄清(“我试图用增量值填充容器的内容”),你真正想要的是std::iota。我还没有完全理解你要对matrix做什么,以及你希望值如何增加(按行或逐列),所以我将给出一个正常的演示向量,让你弄清楚如何在实际情况中应用它:

std::vector<int> v(10);

std::iota(v.begin(), v.end(), 22.2);

for (auto i : v)
    std::cout << i << " ";

应该产生:22.2 23.2 24.2 25.2 26.2 27.2 28.2 29.2 30.2 31.2

相关问题