我现在跟着你的建议我还有另一个问题。
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:复制符号Ableton :: compare(Ableton :: Marker *,Ableton :: Marker *)在/..../MarkerContainer.o和/..../main.o中用于架构x86_64 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用) Command / Developer / usr / bin / clang ++失败,退出代码为1
再次感谢您,您是否可以向我推荐一些关于STL以及它如何在“地下”工作的书籍,以便更好地了解这些案例中发生的技术问题
pedr0
答案 0 :(得分:2)
问题是你已经包含了以下定义:
Ableton::compare(Ableton::Marker*, Ableton::Marker*)
在头文件中,头文件被多次包含,导致比较函数的多个定义,并且链接器抱怨,因为具有这样的多个定义会破坏 One Definition Rule 。
<强>解决方案:强>
将定义放在cpp
文件中,或将其标记为inline
,以防您希望它位于头文件中。
答案 1 :(得分:0)
我认为你应该在比较器中使用引用。试试这个变种
bool compare(const Marker*& p1, const Marker*& p2){return p1<p2;}