我是使用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的定义只允许使用一元函数。我将功能改为一元,并让它发挥作用。
答案 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;
代替。