2014-02-28 46 views
0

首先,我很抱歉如果我的代碼很糟糕,令人困惑。這就是說我一直在爲學校開展一個項目,我無法弄清楚我做錯了什麼。它與我一起將原始數組輸入到智能指針向量中。如果我需要發佈所有代碼,但我會嘗試分享看似相關的代碼。使用智能指點器進行分類時的問題

下面是所有的類定義等

template <typename T> 
class sptr { 
public: 
    sptr(T *_ptr=NULL) { ptr = _ptr;} 

    bool operator < (const sptr &rhs) const 
    { return *ptr < *rhs.ptr;} 

private: 
    T *ptr; 

}; 

template <class T> 
class slist { 
    private: 
    struct node { 
     node() { data=T(); next=NULL; } 
     // add overloaded operator< code 
     bool operator<(node rhs){ 
      if(data < rhs.data) 
       return true; 
      return false; 
     } 
     T data; 
     node *next; 
    }; 

    public: 
    class iterator { 
    public: 
     iterator() : p(NULL) {} 
     T & operator*() { return p->data; } 
     iterator & operator++() { p = p->next; return *this; } 
     bool operator!=(const iterator & rhs) const { return p != rhs.p; } 

    private: 
     friend class slist<T>; 
     iterator(node *p) : p(p) {} 
     node *p; 
    }; 

    public: 
    slist(); 
    ~slist(); 

    void push_back(const T &); 
    void sort(); 

    iterator begin() { return iterator(head->next); } 
    iterator end() { return iterator(NULL); } 
    int N; 

    private: 
    node *head; 
    node *tail; 
}; 

下面是實際的排序代碼

void slist<T>::sort() 
{ 
    // set up smart point array for list 
    vector<sptr<node> > Ap(N); 
    iterator it; 
    node *temp = head->next; 

    // Couldnt figure out syntax of assigning values to the array 

    for(int i = 0; i < N; i++){ 
     sptr<node> temp2(*temp); 
     Ap[i] = temp2; 
     temp = temp->next; 
    } 


    // apply std::sort 
    std::sort(Ap.begin(), Ap.end()); 
    // relink linked list using sort result 
    node *ptr = head->next; 
    for(int i=0; i < N; i++){ 
     ptr = Ap[i]; 
     ptr -> next = Ap[i+1]; 
    } 

} 

的約不能夠找出語法註釋下環是主要問題領域。當我嘗試編譯時,我得到了一個錯誤陳述的混亂。錯誤輸出如下。

sort3b.cpp: In member function 'void slist<T>::sort() [with T = record]': 
sort3b.cpp:217:18: instantiated from here 
sort3b.cpp:166:25: error: no matching function for call to 'sptr<slist<record>::node>::sptr(slist<record>::node&)' 
sort3b.cpp:166:25: note: candidates are: 
sort3b.cpp:69:2: note: sptr<T>::sptr(T*) [with T = slist<record>::node] 
sort3b.cpp:69:2: note: no known conversion for argument 1 from 'slist<record>::node' to 'slist<record>::node*' 
sort3b.cpp:67:7: note: sptr<slist<record>::node>::sptr(const sptr<slist<record>::node>&) 
sort3b.cpp:67:7: note: no known conversion for argument 1 from 'slist<record>::node' to 'const sptr<slist<record>                               ::node>&' 
sort3b.cpp:217:18: instantiated from here 
sort3b.cpp:177:3: error: cannot convert 'sptr<slist<record>::node>' to 'slist<record>::node*' in assignment 
sort3b.cpp:178:3: error: cannot convert 'sptr<slist<record>::node>' to 'slist<record>::node*' in assignment 
make: *** [sort3b] Error 1 

任何幫助將不勝感激。瞭解我可能很簡單。我知道這與將數據提供給智能指針向量有關,但我完全陷入了困境。

停止引用臨時文件後出現新的錯誤消息。

sort3b.cpp: In member function 'void slist<T>::sort() [with T = record]': 
sort3b.cpp:217:18: instantiated from here 
sort3b.cpp:177:3: error: cannot convert 'sptr<slist<record>::node>' to 'slist<record>::node*' in assignment 
sort3b.cpp:178:3: error: cannot convert 'sptr<slist<record>::node>' to 'slist<record>::node*' in assignment 

這裏它將是一個類似的問題,但我仍然堅持。我覺得很蠢。

+0

順便說一句,你正試圖排序一個非常糟糕的鏈表。使用數組列表來實現您的排序算法以獲得更好的性能。考慮如何避免使用矢量,因爲它會在算法中增加額外的開銷。 – ebasconp

回答

0

有時,可怕的C++錯誤信息的關鍵是看看它試圖轉換爲什麼。這裏首先嚐試將node轉換爲node*。這意味着它正在尋找一個指針,但你沒有給它一個。

因此請停止參照temp

+0

謝謝幫助,但現在我得到一個新的類似的消息。我嘗試解引用A [i]類型的數組,但也沒有做到這一點。 –

+0

再一次,看看它試圖轉換爲什麼(以及它發生什麼)。你收到的錯誤信息是告訴你到底是什麼問題。 –