函数编译时错误

Functor compile time error

我的代码 -

#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。我添加了 headers。我正在为二维数组使用 Boost 矩阵。

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

这在documentation中有说明。

很遗憾,您没有告诉我们您要做什么,所以我无法为您提供修复建议。

可能的解决方法是更改​​:

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

进入:

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

如果这符合您想要的,那就是问题...

您要找的函数是std::transform:

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

根据评论中的说明 ("I am trying to fill the contents of my container such with incrementing values"),您真正想要的是 std::iota。我还没有完全弄清楚你想用你的 matrix 做什么,以及你希望值如何增加(按行或按列),所以我将给出一个正常的演示vector,让你自己想办法在实际情况下应用:

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