C++ std::list.sort(谓词)编译器错误

C++ std::list.sort(谓词)编译器错误,c++,stl,C++,Stl,我听从你的建议,现在我有另一个问题 ifndef MARKERCONTAINE_H define MARKERCONTAINE_H include <list> include <string> include "Marker.h" namespace Ableton { struct DeferencedEqual{ DeferencedEqual(const Marker* compare_to) : compare_to_(compare

我听从你的建议,现在我有另一个问题

ifndef MARKERCONTAINE_H
define MARKERCONTAINE_H
include <list>
include <string>
include "Marker.h"
namespace Ableton {

    struct DeferencedEqual{

        DeferencedEqual(const Marker* compare_to) : compare_to_(compare_to) { }

        bool operator()(Marker* c1) const {return  *c1 == *compare_to_;}  

        private:
            const Marker* compare_to_;
    };

    bool compare(Marker* const p1, Marker* const p2){return p1<p2;}

class MarkerContainer {

private:
    std::list<Marker*> list;
    double end_t;
    inline bool exists(std::list<Marker*> *input_list, Marker* check);
   // inline int computeInterval(double to_convert, bool beat_t=true);

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

};



}
我的main.cpp是:

include "Marker.h"
include "MarkerContainer.h"
include <iostream>
include <list>
include <string>
include <cctype>

using namespace std;

int main (int argc, const char * argv[])
{

    Ableton::MarkerContainer::MarkerContainer container =  Ableton::MarkerContainer::MarkerContainer(10.0);
    Ableton::Marker::Marker* one = new Ableton::Marker::Marker(1.0, 1.0);
    Ableton::Marker::Marker* two = new Ableton::Marker::Marker(2.0, 1.0);
    Ableton::Marker::Marker* three = new Ableton::Marker::Marker(3.0, 1.0);

    if(!container.addMarker(one))
        cout << *one << "NOT Added" << endl;
    if(!container.addMarker(two))
        cout << *two << "NOT Added" << endl;
    if(!container.addMarker(three))
        cout << *three << "NOT Added" << endl;
    cout << "-- LIST " << endl;

    container.printAll();

    cout << "-- LIST after sort" << endl;
    //container.printAll();

}
包括“Marker.h”
包括“MarkerContainer.h”
包括
包括
包括
包括
使用名称空间std;
int main(int argc,const char*argv[]
{
Ableton::MarkerContainer::MarkerContainer container=Ableton::MarkerContainer::MarkerContainer(10.0);
Ableton::Marker::Marker*one=新的Ableton::Marker::Marker(1.0,1.0);
Ableton::Marker::Marker*two=新的Ableton::Marker::Marker(2.0,1.0);
Ableton::Marker::Marker*three=新的Ableton::Marker::Marker(3.0,1.0);
如果(!container.addMarker(一个))

cout我认为你应该在比较器中使用引用。试试这个变体

bool compare(const Marker*&  p1, const Marker*&  p2){return p1<p2;}

bool compare(const Marker*&p1,const Marker*&p2){return p1问题可能是您包含了以下定义:

Ableton::compare(Ableton::Marker*, Ableton::Marker*)    
在头文件中,头文件被多次包含,导致比较函数的多个定义,链接器会抱怨,因为有这样多个定义会破坏

解决方案:

将定义放入
cpp
文件中,或者将其标记为
inline
,以防您希望它位于头文件中。

您能指出上面代码片段来自的源文件吗?但是我实现了这个规则:,为什么它不起作用?@pedr0:Include防止在单个翻译单元中多次包含。
inline
允许跨多个翻译单元进行多个定义。@pedr0:这回答了您的问题,
Ableton::compare(Ableton::Marker*, Ableton::Marker*)