我正在使用MSVC 2012,当我编译下面的程序时,它说:
该术语不评估为采用0参数的函数
我确信问题出在mem_fun
和mem_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();
}
答案 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));
}
};
我将代码更改为此。