1

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

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

我确信问题出在mem_funandmem_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();
}
4

3 回答 3

3

问题是返回的函子mem_fun将有一个operator()接受1个类型参数的函数,Generate*但使用的函子std::generate不应该接受任何参数。

如果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 后,这编译得很好。

于 2013-08-08T13:45:17.273 回答
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)
于 2013-08-08T13:46:52.637 回答
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));
    }
};

我将代码更改为此。

于 2013-08-08T14:31:16.880 回答