2012-02-01 35 views
0

我试图超载的std ::发现功能,通过这种方式:超载性病:发现功能

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; 

     } 

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

Out-of-line definition of 'find' does not match any declaration in namespace 'std' in /Users/.../MarkerContainer.h

我希望我做了一些愚蠢的错误,我想要做的是简单..任何想法?

在此先感谢! 彼得

+2

C++标准不允许你在'std'创建函数命名空间。 – 2012-02-02 00:01:46

+0

@OliCharlesworth:总的来说,是的,但你可以专门做。 (不是说这个Q是专门的) – 2012-02-02 00:18:07

回答

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)); 
+0

什么DeferEquality是!!!! ??? – pedr0 2012-02-02 22:06:59

+0

好!我明白了!对于有同样问题的人,请参阅:http://www.cplusplus.com/reference/algorithm/find_if/ – pedr0 2012-02-02 22:08:40

0

您不能重载这样的功能:你需要在一个适当的名称空间来定义过载。您需要在全局范围打开名称空间std。具体来说,命名空间std我认为你不能这样做。否则这将工作。

这么说,我想你应该看看使用std::find_if()用合适的谓语,而不是使用您的手工制作方法:

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