std :: binary_function用法的语法

时间:2010-06-29 19:07:03

标签: c++ stl c++builder

我是使用STL算法的新手,目前我遇到了语法错误。我的总体目标是过滤源列表,就像在c#中使用Linq一样。在C ++中可能还有其他方法可以做到这一点,但我需要了解如何使用算法。

我用作函数适配器的用户定义函数对象是

struct is_Selected_Source : public std::binary_function<SOURCE_DATA *, SOURCE_TYPE, bool>
{
bool operator()(SOURCE_DATA * test,  SOURCE_TYPE ref)const
    {
    if (ref == SOURCE_All)
        return true;
    return test->Value == ref;
    }
};

在我的主程序中,我使用如下 -

typedef std::list<SOURCE_DATA *> LIST;
LIST; *localList = new LIST;;
LIST* msg = GLOBAL_DATA->MessageList;
SOURCE_TYPE _filter_Msgs_Source = SOURCE_TYPE::SOURCE_All;

std::remove_copy(msg->begin(), msg->end(), localList->begin(),
    std::bind1st(is_Selected_Source<SOURCE_DATA*, SOURCE_TYPE>(), _filter_Msgs_Source));

我在Rad Studio 2010中收到以下错误。错误表示“您的源文件使用了typedef符号,其中变量应出现在表达式中。”

  

“E2108不正确使用typedef'is_Selected_Source'”


编辑 - 在具有更好的编译器诊断功能的VS2010中进行了更多实验之后,我发现问题在于remove_copy的定义只允许使用一元函数。我将功能改为一元,并让它发挥作用。

2 个答案:

答案 0 :(得分:0)

(这只有在您不小心忽略问题中的某些代码时才有意义,并且可能无法解决您遇到的确切问题)

您使用is_Selected_Source作为模板,即使您没有将其定义为模板。第二个代码段中的最后一行应为std::bind1st(is_Selected_Source() ...

或许您确实想将它用作模板,在这种情况下,您需要向结构添加模板声明。

template<typename SOURCE_DATA, typename SOURCE_TYPE>
struct is_Selected_Source : public std::binary_function<SOURCE_DATA *, SOURCE_TYPE, bool>
{
    // ...
};

答案 1 :(得分:0)

猜测(虽然这只是一个猜测)问题是std::remove_copy期望,但是你提供了一个谓词。要使用谓词,您需要使用std::remove_copy_if(然后您需要注意@Cogwheel的答案)。

我还要注意:

LIST; *localList = new LIST;;

看起来不对 - 我猜你有意:

LIST *locallist = new LIST;

代替。