使用STL

时间:2016-05-09 05:59:14

标签: c++ templates

使用STL

反转带有递归的链接列表的代码
          #include<iostream>
#include<conio.h>
#include<list>
using namespace std;
template<typename T>
class node
{
public:
    T data;
    node<T> *next;
    node(){ next = NULL; }
    node(const T& item, node<T> *nextnode = NULL)
    {
        data = item;
        next = nextnode;
    }
};
template<typename T>
class Reverse_list
{
private:
    node<T> *head;
    void reverse(node<T> *front);
public:
    Reverse_list(){ head = NULL; }
    //template<typename T>
    void Reverse();
    template<typename T>
    void Display( list<T>& alist );
};


int main()
{
    Reverse_list <int> rl;
    list<int> intlist;
    int size, no;
    cout << "Size of List ?? ";
    cin >> size;
    for (int i = 1; i <= size; i++)
    {
        cout << "Enter the " << i <<" "<< "element";
        cin >> no;
        intlist.push_front(no);
    }


    rl.Display(intlist);

    rl.Reverse();
    rl.Display(intlist);
    _getch();
    return 0;

}

template<typename T>
void Reverse_list<T>::Display(list<T>& alist)
{
    list<int>::iterator iter = alist.begin();
    while (iter != alist.end())
    {
        cout << *iter << "  ";
        iter++;
    }
}

template<typename T>
void Reverse_list<T>::reverse(node<T> *front)
{
    if (front->next == NULL)
    {
        head = front;
        return;
    }
    reverse(front->next);
    node<int> *back = front->next;
    back->next = front;
    front->next = NULL;
}
template<typename T>
void Reverse_list<T>::Reverse()
{
    reverse(head);
}

上面的代码会产生2个错误。

错误1)没有函数模板的实例与参数列表匹配。 (没有错误编号。)

如果我删除第1行(在代码中提到),那么上面的错误就不再存在了。 (为什么?)

错误2)C2783:'void Reverse_list :: Reverse1(void)':无法推断'T'的模板参数

如何解决上述错误。

在上面的程序中,我想要传递“head”节点(私有)作为
反向函数的参数。但我们无法访问课外的私人成员。所以我间接通过了。这是一种正确的传递途径吗?或者还有其他一些访问私人数据的方法?

1 个答案:

答案 0 :(得分:0)

我不确定你的意图,但......

您是否尝试在另一个方法(reverse())中声明方法(Reverse())? Uhmmm ....

我们稍后再回来。

想象一下,以下指令是Reverse_list<T>::Reverse()

的正确指令
node<T> *back = front->next;

为什么在为其分配back(特定Node<T>)时,将front->next声明为指向通用Node<int>的指针?

如果您将back定义为node<int>指针,则方法Reverse()不再需要成为模板(取决于T)方法。你可以避免这两个错误。

使用您的实际代码,当您致电

rl.Reverse();

您调用模板方法,但编译器不知道如何确定类型T。你可以用这种方式明确它

rl.Reverse<int>();

但是,如前所述,如果你删除整个模板部分,我会更好。

或者,您也可以在模板类中转换整个类;其中head是指向通用Node<T>的指针,而不是指定Node<int>的指针。

类似的东西(如果我理解你的意图)

template <typename T>
class Reverse_list
 {
   private:
      node<T> *head;

      void reverse (node<T> * front);

   public:
      Reverse_list() : head(NULL)
       { }

      void Reverse();
      void Display(list<T>& alist);
 };

template<typename T>
void Reverse_list<T>::reverse (node<T> * front)
 {
   if (front->next == NULL)
    {
      head = front;
      return;
    }
   reverse(front->next);
   node<T> *back = front->next;
   back->next = front;
   front->next = NULL;
 }

template<typename T>
void Reverse_list<T>::Reverse()
 { reverse(head); }

在这种情况下,在main()中,rl应声明为

Reverse_list<int> rl;

T修改为int,并且对Reverse()的调用应为

rl.Reverse();

---编辑2016.05.10 ---

使用&#34;模板Reverse_list&#34;解决方案,你应该纠正三点(最后)。

1)在Reverse_list类声明中,您在template<typename T>之前评论了void Reverse()行;好;你应该在void Display( list<T>& alist );之前删除(评论)同一行(出于同样的原因);所以班级成为

template<typename T>
class Reverse_list
{
private:
    node<T> *head;
    void reverse(node<T> *front);
public:
    Reverse_list(){ head = NULL; }
    //template<typename T>
    void Reverse();
    //template<typename T>
    void Display( list<T>& alist );
};

2)Display()现在是模板类的方法;所以这一行

list<int>::iterator iter = alist.begin();

成为

list<T>::iterator iter = alist.begin();

3)reverse()现在是模板类的方法;所以这一行

node<int> *back = front->next;

成为

node<T> *back = front->next;