2010-06-29 77 views
0

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

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

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符号,其中变量应出现在表达式中”。

“的typedef E2108使用不当‘is_Selected_Source’”


编辑 - 做VS2010中,它具有更好的编译器诊断的详细的实验后,我发现这个问题是remove_copy的定义只允许uniary功能。我将这个功能改为非法行为并让它起作用。

回答

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> 
{ 
    // ... 
}; 
+0

您的第一个答案解决了我的大部分问题,但是现在当我编译时,我得到了 - E2034无法将'const SOURCE_TYPE'转换为'SOURCE_DATA *' – 2010-06-29 20:01:37

+0

使用修改后的代码和错误消息可能会更简单。当使用单个线程解决一段时间内的几个问题时,它可能会有点混乱:) – Cogwheel 2010-06-29 20:08:06

+0

乍一看,听起来好像你正在用错误的参数实例化binary_function。也许你正在传递指针类型作为参数,当你只是传递基类型? (is_Selected_Source模板处理将其转换为指针) – Cogwheel 2010-06-29 20:09:36

0

在猜测(尽管这只是一个猜测)的问题是,std::remove_copy需要一个,但你提供一个谓语。要使用谓词,你想使用std::remove_copy_if(然后你会想听@Cogwheel的答案)。

我还注意到:

LIST; *localList = new LIST;; 

看来错了 - 我猜你想要的结果:

LIST *locallist = new LIST; 

代替。