簡體   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