以下代码不起作用

时间:2013-08-08 13:38:39

标签: c++ stl

我正在使用MSVC 2012,当我编译下面的程序时,它说:

  
    

该术语不评估为采用0参数的函数

  

我确信问题出在mem_funmem_fun_ref函数调用上。请提供正确的方式来调用这些功能。

#include<iostream>
#include<algorithm>
#include<functional>
#include<string>
#include<vector>
#include<iterator>

using namespace std;

#define PRINT(A, Sp) copy(A.begin(), A.end(), ostream_iterator<decltype(*A.begin())>(cout, Sp))

struct Generate {
    int a;
    Generate(int a) : a(a) {
    }
    Generate gen() {
        return Generate(rand()%100);
    }
    void testing() {
        vector<Generate> a(5), b, c;
        generate(a.begin(), a.end(), mem_fun(&Generate::gen));
        generate_n(back_inserter(b), 5, mem_fun_ref(&Generate::gen));
    }
};

void main() {
    Generate a(32);
    a.testing();
}

3 个答案:

答案 0 :(得分:3)

问题是由mem_fun返回的仿函数将有一个operator(),它接受​​Generate*类型的1个参数,但std::generate使用的仿函数不应该参数。< / p>

如果gen不需要访问类数据,则可以将其设为static并完全删除mem_fun

#include<iostream>
#include<algorithm>
#include<functional>
#include<string>
#include<vector>
#include<iterator>
using namespace std;
#define PRINT(A, Sp) copy(A.begin(), A.end(), ostream_iterator<decltype(*A.begin())>(cout, Sp))
struct Generate {
    int a;
    Generate() {}
    Generate(int a) : a(a) {
    }
    static Generate gen() {
        return Generate(rand()%100);
    }
    void testing() {
        vector<Generate> a(5), b, c;
        generate(a.begin(), a.end(), &Generate::gen);
        generate_n(back_inserter(b), 5, &Generate::gen);
    }
};

int main() {
    Generate a(32);
    a.testing();
}

在我添加默认构造函数并使main返回int。

之后编译好了

答案 1 :(得分:2)

形式的东西

auto f = mem_fun(&Generate::gen);

生成一个带有Generate类型参数的函数:

auto f = mem_fun(&Generate::gen);
Generate g;
auto x = f(g);

std::generate_n要求算子不带参数。

看起来你需要一些形式

std::bind(&Generate::gen, this)

答案 2 :(得分:0)

    struct Generate {
    int a;
    Generate(int a) : a(a) {
    }
    Generate(){}
    Generate gen() {
        return Generate(rand()%100);
    }
    void testing() {
        vector<Generate> a(5), b, c;
        generate(a.begin(), a.end(), bind(mem_fun(&Generate::gen), this));
        generate_n(back_inserter(b), 5, bind(mem_fun(&Generate::gen), this));
    }
};

我将代码更改为此。