[英]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.