繁体   English   中英

以下代码不起作用

[英]The following code does not work

我正在使用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();
}

问题在于,由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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM