1

次のリンク リストでは、印刷機能を実装しようとしています。関数はテンプレート化されており、Node クラスの一部ではありません。

Node->data基本的に、この印刷機能を動的にして、すべてを手動で印刷する必要がないようにしたいと考えています。私はこの例の行に沿って作業しています: http://www.cstutoringcenter.com/tutorials/cpp/cpp17.php

ただし、印刷機能を実装しようとすると、、、、などのコンパイラ エラーが発生 node was not declared in this scopep' was not declared in this scopeますvariable 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

いくつかの問題があります。タイプミス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 に答える