English 中文(简体)
发现——如果职能产生问题
原标题:
  • 时间:2009-05-27 00:14:57
  •  标签:

I m试图在1-file .cpp档案中建立以下编码系统:

#include <iostream>

#include <algorithm>
using namespace std;

class test
{

public:

    int a[10];
    int index;

    test();
    ~test();
    bool equals(int p);
    void search();
};

test::test()
{
    int temp[10] = {4, 9, 5, 6, 9, 10, 9, 255, 60, 0};

    memcpy(a, temp, sizeof(temp));

    index = -1;
}

bool test::equals(int p)
{
    return p == 9;
}

void test::search()
{
    int* p = std::find_if(a, a+10, &test::equals);
    while (p != a+10)
    {
        cout<< *p;
        index = p - a;
        p = std::find_if(p+1, a+10, &test::equals);
    }
}

int main(int argc, char *argv[])
{
    test object;

    object.search();

    return 0;
}

我正在发现一个错误,如下文所示,我不敢肯定在我使用“如果在某类成员方法中发挥作用”时会出现什么情况。 我在这样做时会发现这一错误。

1>c:program filesmicrosoft visual studio 8vcincludealgorithm(87) : error C2064: term does not evaluate to a function taking 1 arguments
1>        c:program filesmicrosoft visual studio 8vcincludealgorithm(96) : see reference to function template instantiation  _InIt std::_Find_if(_InIt,_InIt,_Pr)  being compiled
1>        with
1>        [
1>            _InIt=int *,
1>            _Pr=bool (__thiscall test::* )(int)
1>        ]
1>        c:	estprogram
omfcmain.cpp(32) : see reference to function template instantiation  _InIt std::find_if(_InIt,_InIt,_Pr)  being compiled
1>        with
1>        [
1>            _InIt=int *,
1>            _Pr=bool (__thiscall test::* )(int)
1>        ]
最佳回答

<代码>find_if功能预期可称作无参数功能的物体。 这是一种自由功能、功能目标或固定类别功能。 您在<代码>上通过,成员职能中没有任何一项。 可以通过使<条码>平等>功能成为自由功能或固定功能来解决这个问题,因为它不需要<条码>测试>的任何成员。

// static
class test
{
  public:
    static bool equals(int p); // etc
};
int* p = std::find_if(a, a+10, &test::equals);

// free
bool equals(int p)
{
    return p == 9;
}
int* p = std::find_if(a, a+10, equals);

如果你的真实守则要求它成为成员,那么你就应该通过一个功能性物体,作为班级关闭。 我赞成为此采用波斯特约束方法,但还有其他方法。

int* p = std::find_if(a, a+10, boost::bind(&test::equals, this, _1));
问题回答

<代码>测试:等于为成员功能,与普通职能点不同。 特别是,请打电话find_if。 将需要一种类型的<代码>测试的标的,它没有(例如,它自动在<条码>上打上“条码/代码”,而这正是你所铭记的。

您可在<条码>上下调<条码>等值/条码>,并应当工作。

int *p = find_if(a, a+10, bind1st(mem_fun(&test::equals), this));

或者更糟的是,取而代之的是:平等() 成员职能,然后

int *p = find_if(a, a+10, bind2nd(equals(), 9));

在事实上平等的地方,<代码>std:equis (), a binary functor specified in Header <Function>

第3条:<代码>的限定语 必须是一种(指某一点的)功能或一种论点,而不是一种(指某一点的)检验方法,这是你再次使用的方法。 例如,适当的导师可以(从[原 ]调取)?

template <typename PType, typename ArgType>
class is_good_test : unary_function<PType, bool>
{ public:
is_good_test(const ArgType & arg) : _val(arg) { }
~is_good_test() { }

bool operator()(const PType p) const
{
return p->equals(_val);
}

private:
ArgType _val;
};

请你:

std::find_if(a, a+10, is_good_test<test*, int>(10))


  [1]: http://www.velocityreviews.com/forums/t288980-functors-and-stl-findif.html




相关问题
热门标签