超载std:find函数

时间:2012-02-01 23:58:58

标签: c++ stl

我尝试以这种方式重载std :: find函数:

include <list>
include <string>
include "Marker.h"

namespace Test {



    class MarkerContainer {

    private:
        std::list<Marker*> list;
        double end_t;
        inline bool exists(std::list<Marker*> *input_list, Marker* check);
    public:

        MarkerContainer();
        MarkerContainer(double end_time);
        bool addMarker(Marker* input);
        double computeBeatTime(double sample_t);
        double computeSampleTime(double beat_t);    
        void printAll();

    };

    }


    std::list<Ableton::Marker*>::iterator std::find(std::list<Ableton::Marker*>::iterator first, std::list<Ableton::Marker*>::iterator last, Ableton::Marker* value){
            for ( ;first!=last; first++) if ( **first==*value ) break;
            return first;

        }

但我抓住了这个编译错误:

  

'find'的外线定义与中的任何声明都不匹配   / Users /.../ MarkerContainer.h

中的命名空间'std'

我希望我犯了一些愚蠢的错误,我想做的事情很简单......任何想法?

提前致谢! 彼得

2 个答案:

答案 0 :(得分:3)

您不能超载find。您可以在std命名空间中专门化模板,但在这种情况下,将find_if与解除引用仿函数一起使用会更加简单。

// Create DerefEquality comparison (I'll try to come back later and write it).
container_type::iterator iter = find_if(container.begin(), container.end(), DerefEquality(item_to_find));

答案 1 :(得分:0)

您不能重载这样的函数:您需要在适当的命名空间中定义重载。您需要在全局范围内打开名称空间std。特别是对于命名空间std,我认为你不允许这样做。否则这会奏效。

那就是说,我认为你应该考虑将std::find_if()与合适的谓词一起使用,而不是使用手工制作的方法:

auto it = std::find_if(list.begin(), list.end(),
                       [=](Abelton::Marker* el)->bool { return *el == *check; });