1

在下面的链接列表中,我正在尝试实现打印功能。该函数是模板化的,并且不是 Node 类的一部分。

基本上我希望这个打印功能是动态的,这样我就不必Node->data手动打印出所有的东西。我有点按照这个例子的思路工作:http ://www.cstutoringcenter.com/tutorials/cpp/cpp17.php

但是,当我尝试实现打印功能时,会出现编译器错误,例如: node was not declared in this scopep' was not declared in this scopevariable or field 'print' declared void.

这是我的程序:

#include<iostream>
using namespace std;

template<typename T>
class Node
{
 public:
        Node(T = 0);
        ~Node() { delete [] nextPtr; };

        T getData() const;
        Node<T>*& getNextPtr() { return nextPtr; };

 private:
        T data;
        Node<T> *nextPtr;    
};

//CONSTRUCTOR   
template<typename T>
Node<T>::Node(T newVal)
     : data(newVal), nextPtr(NULL)
{
    //EMPTY       
};

//GETDATA() -- RETURN DATA VALUE
template<typename T>
T Node<T>::getData() const
{
      return data;

};

//PRINT FUNCTION
template<typename T>
void print(node<T>* p)
{
     while(p)
     {
             cout << p->data();
             p = p->link();        
     }
};

int main()
{
    Node<int> intNode1(5),  intNode2(6), intNode3(7);

    intNode1.getNextPtr() = &intNode2;
    intNode2.getNextPtr() = &intNode3;

    print(&intNode1);

    system("pause");   
}

我究竟做错了什么?

4

3 回答 3

1

你打印功能:

template<typename T>
void print(node<T>* p)

应该:

template<typename T>
void print(Node<T>* p)
           //^^^^

由于您的代码中没有node定义类模板。

编辑:节点类中没有link()data()定义。

于 2013-04-16T19:13:16.790 回答
1

有几个问题,你打错了Node,你没有正确使用界面,这将编译:

template<typename T>
void print(Node<T>* p)
{
     while(p)
     {
             cout << p->getData() << std::endl;
             p = p->getNextPtr();        
     }
}

添加std::endl以确保您看到输出。此外,您使用析构函数的类的方式将调用delete非动态分配的数据。因为intNode2intNode3都分配在堆栈上。您还使用了delete []应该使用的数组删除delete。这是潜在的修复main

int main()
{
    Node<int> intNode1(5) ;

    Node<int> *nPtr = intNode1.getNextPtr() = new Node<int>(6);
    nPtr->getNextPtr() = new Node<int>(7) ; 

    print(&intNode1);

    system("pause") ; // This is not portable
}
于 2013-04-16T19:16:22.103 回答
0

也许您的意思是键入Node而不是node,因为您Node<T>在其他任何地方都使用...

于 2013-04-16T19:12:51.383 回答