代码之家  ›  专栏  ›  技术社区  ›  photo_tom

std::binary_函数用法的语法

  •  0
  • photo_tom  · 技术社区  · 14 年前

    我是一个使用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));
    

    我在RADStudio2010中得到了以下错误。错误表示“源文件使用了typedef符号,其中变量应出现在表达式中。”

    “E2108不正确使用typedef”“is”“u selected”“源”“”


    编辑- 在VS2010中做了更多的实验,它有更好的编译器诊断,我发现问题在于,remove_copy的定义只允许单元函数。我把函数改为单圈函数,然后使它开始工作。

    2 回复  |  直到 10 年前
        1
  •  0
  •   Cogwheel    14 年前

    (仅当您没有意外地从问题中省略某些代码,并且可能无法解决您遇到的确切问题时,这才相关)

    你在用 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>
    {
        // ...
    };
    
        2
  •  0
  •   Jerry Coffin    14 年前

    猜测一下(虽然只是猜测),问题是 std::remove_copy 期望A 价值 ,但您提供的是谓词。要使用谓词,请使用 std::remove_copy_if (然后你就要注意@cogwheel的答案了)。

    我还注意到:

    LIST; *localList = new LIST;;
    

    看起来不对——我猜你是故意的:

    LIST *locallist = new LIST;
    

    相反。