1

私は MSVC 2012 を使用しています。以下のプログラムをコンパイルすると、次のように表示されます。

この項は、引数を 0 個取る関数として評価されません

mem_fun問題はandmem_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

問題は、 によって返されるファンクターには型の引数を 1 つ取るmem_funが、 によって使用されるファンクターはパラメーターを取らないことです。operator()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);

type の引数を取る関数を生成します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 に答える