c++ - std::list.sort(Predicate) 编译器错误

标签 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_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();

};



}

函数排序现在是:

 namespace Ableton {

    void MarkerContainer::sort(){

       list.sort(compare);
    }

    }

我的 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();

}

现在我发现了这个 ld 错误,这对我来说听起来很奇怪......在 C++ 中对我来说没有办法吗? :-)

ld: duplicate symbol Ableton::compare(Ableton::Marker*, Ableton::Marker*) in /..../MarkerContainer.o and /..../main.o for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) Command /Developer/usr/bin/clang++ failed with exit code 1

再次感谢,您能否推荐一些关于 STL 及其“地下”工作原理的书籍,以便从技术上更好地理解这些案例中发生的事情

pedr0

最佳答案

问题可能是您包含了以下定义:

Ableton::compare(Ableton::Marker*, Ableton::Marker*)    

在头文件中并且头文件被多次包含导致比较函数的多个定义并且链接器提示因为这样的多个定义破坏了 One Definition Rule

解决方案:
将定义放在 cpp 中文件或将其标记为 inline如果您希望它位于头文件中。

关于c++ - std::list.sort(Predicate) 编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9148940/

相关文章:

c++ - 通过单击 QGraphicsItem 获取带有文本的 QRectF

c++ - 为什么我必须在 'using' 语句之前添加额外的标记?

c++ - 从不同格式的文件中读取行 C++

c++ - 在另一个线程中使用线程 vector : error attempting to reference a deleted function

c++ - 如何返回带有私有(private)比较器的 std::set

C++ 八叉树容器

c++ - 在 Windows 上构建 tensorflow C++ 共享库时出错

c++ - 如何在 C++ 中定义每个维度都是不同类型的 3d 数组?

c++ - 普通数组上的 std::lower_bound 和 std::find

c++ - RAW指针容器包装器