0

ここにコードがあります

#include <string>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

class test {
    struct con {
        string s1;
        string s2;
    };
public:
    void somefunc();

private:
    bool pred(con c1, con c2);
    vector<con> vec;
};

void test::somefunc()
{
    vector<con> v;
    vector<con>::iterator it = find_first_of(vec.begin(), vec.end(), v.begin(), v.end(), pred);
}

bool test::pred(con c1, con c2)
{
    return 0;
}

それはエラーを与える

est.cpp(24) : エラー C2664: 'struct test::con *__cdecl std::find_first_of(struct test::con *,struct test::con *,struct test::con *,struct test::con * ,bool (__thiscall *)(struct test::con,str uct test::con))' : パラメータ 5 を 'bool (struct test::con,struct test::con)' から 'bool (__thiscall * )(struct test::con,struct test::con)' スコープ内のこの名前の関数は、ターゲットの型と一致しません

(__thiscall*) とは何か、述語関数をそれに変換する方法がわかりません。

4

3 に答える 3

2

述語を非静的メンバー関数にすることはできません。これは、暗黙的な最初のパラメーターを取り、合計 3 つのパラメーターを与えるためです。静的メンバー関数または非メンバーのいずれかが必要です。

// non-member function
bool pred(const con& c1, const con& c2)
{
    return false;
}

void test::somefunc()
{
  vector<con> v;
  vector<con>::iterator it = find_first_of(vec.begin(), vec.end(), 
                                           v.begin(), v.end(), 
                                           pred);
}

または、最初のパラメーターとしてstd::bindバインドするために使用します。this

using namespace std::placeholders;
vector<con>::iterator it = find_first_of(vec.begin(), vec.end(), 
                                         v.begin(), v.end(),
                                         std::bind(&test::pred, this, _1, _2));

への呼び出しstd::bindは、2 つのパラメーターを持つ呼び出し可能なエンティティを生成しconます。thisポインターのコピーを内部に格納します(ただし、関数thisでは使用されませんpred)。

于 2013-06-11T16:03:26.440 に答える
1

__thiscallMSVC++ でのみ非静的メンバー関数に使用される呼び出し規約です。

コードでpredは、 は非静的メンバー関数であり、 などの回避策なしではバイナリ述語として使用できませんstd::bind。この関数を作成することをお勧めしますstatic。または、ラムダを使用することをお勧めします(C++11 のみ)。

于 2013-06-11T16:01:35.447 に答える