2012-02-05 3 views
1

나는 당신의 제안에 따라 지금 또 다른 문제가 있습니다.std :: list.sort (Predicate) 컴파일러 오류

namespace Ableton { 

    void MarkerContainer::sort(){ 

     list.sort(compare); 
    } 

    } 

그리고 내 MAIN.CPP은 다음과 같습니다 :

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

}; 



} 

함수 종류 지금

이제
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

을 speacking 이러한 경우에 무슨 일이 있었는지 더 잘 이해하기 위해, "지하"작동하는 방법
+0

위 코드 스 니펫의 소스 파일을 나타낼 수 있습니까? – hmjd

답변

2

시도 이러한 여러 정의가있는 경우 링커가 불만을 제기합니다. One Definition Rule.

솔루션 :
퍼트는 A cpp 파일에 정의 또는 당신이 헤더 파일에 있어야 할 그 경우 inline로 표시합니다.

+0

하지만이 규칙을 구현했습니다 : http://en.wikipedia.org/wiki/Include_guard, 왜 작동하지 않습니까? – pedr0

+0

@ pedr0 : 하나의 번역 단위에 여러 단어가 포함되지 않도록 보호합니다. 'inline'은 많은 번역 단위에 걸쳐 여러 정의를 허용합니다. – Mankarse

+0

@ pedr0 :이 질문에 대한 대답은 [왜 내 컴파일러 보호 물이 여러 정의를 포함하지 못하게합니까?] (http://stackoverflow.com/questions/249701/whya-arent-my-compile-guards-preventing-multiple- 정의 - 내포물) –

0

나는 당신이 비교기에서 참조를 사용해야한다고 생각한다. 여러 비교 기능의 정의와로 이어지는 포함됩니다 헤더 파일 및 헤더 파일에

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

여러 번 : 문제는 당신에 대한 정의를 포함했다 perhpas 인이 변형

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