使用smartpointers进行排序的问题

时间:2014-02-28 01:51:00

标签: c++ sorting pointers smart-pointers

首先,如果我的代码太可怕而令人困惑,我很抱歉。那说我一直在做一个学校的项目,我无法弄清楚我做错了什么。它与我将原始数组输入智能指针向量有关。如果我需要发布我将要发布的所有代码,但我将尝试分享看似相关的代码。

以下是所有类定义等。

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];
    }

}

关于无法弄清楚语法的评论下的for循环是主要问题。当我尝试编译时,我得到了一堆错误声明。错误输出低于。

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

非常感谢任何帮助。知道它可能是非常简单的东西。我知道这与将数据输入智能指针向量有关,但我只是完全卡住了。

我停止引用temp后出现新错误消息。

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

这将是一个类似的问题,但我仍然卡住了。我感到非常愚蠢。

1 个答案:

答案 0 :(得分:0)

有时,可怕的C ++错误消息的关键是看看它试图转换为什么。在这里,它首先尝试将node转换为node*。这意味着它正在寻找一个指针,但你没有给它一个。

请停止取消引用temp