Перегрузка функции std: find - PullRequest
       5

Перегрузка функции std: find

0 голосов
/ 02 февраля 2012

Я попытался перегрузить функцию 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' не соответствует ни одному объявлению в пространство имен 'std' в /Users/.../MarkerContainer.h

Я надеюсь, что совершил какую-то глупую ошибку, и то, что я хотел бы сделать, это просто ... любая идея?

Заранее спасибо! Pietro

Ответы [ 2 ]

3 голосов
/ 02 февраля 2012

Вы не можете перегружать 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));
0 голосов
/ 02 февраля 2012

Вы не можете перегрузить функцию, подобную этой: вам нужно определить перегрузку в соответствующем пространстве имен. Вам нужно открыть пространство имен std в глобальном масштабе. В частности, с пространством имен std Я не думаю, что вам разрешено это делать. В противном случае это будет работать.

Тем не менее, я думаю, вам следует взглянуть на использование std::find_if() с подходящим предикатом, а не на ручной подход:

auto it = std::find_if(list.begin(), list.end(),
                       [=](Abelton::Marker* el)->bool { return *el == *check; });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...