【问题标题】:Functor compile time error仿函数编译时错误
【发布时间】:2015-05-05 21:50:17
【问题描述】:

我的代码 -

#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    

谁能告诉我为什么?

附:我添加了标题。我正在将 Boost 矩阵用于 2D 数组。

【问题讨论】:

  • 你不能提供一个 MCVE 吗?我们甚至不知道该错误是在哪一行生成的......
  • @LightnessRacesinOrbit 我将尝试使用矢量。会这样吗?
  • 这对什么有用吗?你还没有告诉我们你想要做什么......
  • Boost 使用不是你的测试用例出了什么问题,而是缺少标题等。一个好的测试用例是一个允许我们复制粘贴和编译的测试用例,而不必猜测是什么我们可能需要包含的标题。
  • @LightnessRacesinOrbit 我正在尝试用递增值填充容器的内容

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


【解决方案1】:

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

这在documentation 中有说明。

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

【讨论】:

    【解决方案2】:

    一个可能的解决办法是改变:

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

    进入:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        根据评论中的说明(“我正在尝试用递增值填充容器的内容”),您真正想要的是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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-09
          • 1970-01-01
          • 1970-01-01
          • 2021-10-12
          • 2014-05-09
          • 1970-01-01
          相关资源
          最近更新 更多