[英]The following code does not work
我正在使用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();
}
问题在于,由mem_fun
返回的函子将具有一个operator()
,该operator()
带有类型为Generate*
1个参数,但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之后,此编译效果很好。
形式的东西
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)
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));
}
};
我将代码更改为此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.