2016-11-05 23 views
1

リンクされたリストをテンプレートでビルドする必要がありますが、なぜ動作しないのかわかりません。テンプレートを使用する前にリンクリストを作成しました。テンプレートでリンクされたリスト

//linkedList.h 
#pragma once 
#ifndef _LISTASIMPLE_H 
#define _LISTASIMPLE_H 

template<class D> 
struct Nodo 
{ 
    int carga; 
    int binario; 

    D caracter; 

    Nodo<D> *Siguiente;//means next 
}; 



template<class D> 
class listaSimple 
{ 

public: 
    listaSimple(); 
    ~listaSimple(); 

    void InsertarInicio(const D&); 
    bool ListaVacia(); 
    void Mostrar(); 




private: 
    Nodo<D> *primero; 
    Nodo<D> *ultimo; 

}; 

template<class D> 
listaSimple<D>::listaSimple() 
{ 
    primero = NULL; 
} 

template<class D> 
listaSimple<D>::~listaSimple() 
{ 
    Nodo<D> *aux; 
    while (primero != NULL) 
    { 
     aux = primero; 
     primero = primero->Siguiente; 
     delete aux; 
    } 
} 

template<class D> 
void listaSimple<D>::InsertarInicio(const D& dato) 
{ 
    if (ListaVacia()) 
    { 
     primero = new Nodo<D>(dato); 
    } 
    else 
    { 
     Nodo<D> *nodoNuevo = new Nodo<D>(dato); 
     nodoNuevo->Siguiente = primero; 
     primero = nodoNuevo; 
    } 
} 

template<class D> 
bool listaSimple<D>::ListaVacia() 
{ 
    if (primero == NULL) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

template<class D> 
inline 
void listaSimple<D>::Mostrar() 
{ 
    Nodo<D> *aux = primero; 
    while (aux != NULL) 
    { 
     cout << aux->caracter << "->"; 
     aux = aux->Siguiente; 
    } 
} 
:私の次のコードで

Error C2664 'Nodo<D>::Nodo(Nodo<D> &&)': cannot convert argument 1 from 'const int' to 'const Nodo<D> &' Datos2 d:\google drive\visual studio 2015\projects\datos2\datos2\listaSimple.h 69 


Error C2664 'Nodo<D>::Nodo(Nodo<D> &&)': cannot convert argument 1 from 'const int' to 'const Nodo<D> &' Datos2 d:\google drive\visual studio 2015\projects\datos2\datos2\listaSimple.h 73 

:今私の問題は、私はリストを作成した場合、すべてがOKですが、私はそれに何かを挿入しようとすると、私は次のエラーを取得し、ということです

//Source.cpp 
#include <iostream> 
#include <string> 
#include "linkedList.h" 


using namespace std; 

int main() { 
    listaSimple<int> Nueva; 
    Nueva.InsertarInicio(5); 

    system("pause"); 
    return 0; 
} 
+0

'if(EmptyList)'は実際のコードですか?関数を呼び出すと思われるので、カッコがない場合は、たとえば:if(EmptyList()) – UnholySheep

+0

@UnholySheepうわー、翻訳エラーです。それを指摘してくれてありがとう – Twhite1195

+0

'Siguiente'とは何ですか? 'class D'も定義されていません。'listaSimple NewList'はすべて間違っています。おそらく' linkedList NewList'を意味します。ここで私の 'D'は表示されていないクラスです。 –

答えて

1

NodelinkedListの修正版を参照してください。 NodelinkedListには、実際のデータに関する情報が含まれていないことに注意してください。実際には、最後にデータ(struct MyData)を宣言することができます。印刷用

私はに機能を追加しました:この方法でNodelinkedList

node->data.print(); 

データを印刷するために直接責任を負うものではなく、データについて何を知っている必要はありません。彼らはDataTypeにデータの印刷を依頼することができます。 DataTypeには、独自のコンテンツを印刷する機能が含まれていなければなりません。print

template<typename DataType> 
struct Node 
{ 
    DataType data; 
    Node<DataType> *Next; 
    Node() 
    { 
     Next = nullptr; 
    } 
}; 

template<typename DataType> 
class linkedList 
{ 
public: 
    linkedList() 
    { 
     first = NULL; 
    } 

    ~linkedList() 
    { 
     Node<DataType> *aux; 
     while (first != NULL) 
     { 
      aux = first; 
      first = first->Next; 
      delete aux; 
     } 
    } 

    void InsertBegining(const DataType& data) 
    { 
     Node<DataType> *newNode = new Node<DataType>; 
     newNode->data = data; 
     if (first) 
     { 
      newNode->Next = first; 
      first = newNode; 
     } 

     first = newNode; //<== you forgot this 
    } 

    void Print() 
    { 
     Node<DataType> *walk = first; 
     while (walk) 
     { 
      walk->data.print(); 
      walk = walk->Next; 
     } 
    } 

private: 
    Node<DataType> *first; 
}; 

ここでMyDataを宣言して使用できます。 MyDataにはprint機能が含まれていることを確認してください。また、MyDataは、データが割り当てられる方法のためにPOD(普通の古いデータ、ポインタを含むことはできません)でなければなりません。

int main() 
{ 
    struct MyData 
    { 
     int charge; 
     int binario; 
     char ch; 
     void print() 
     { 
      cout << charge << ", " << binario << ", " << ch << "\n"; 
     } 
    }; 

    linkedList<MyData> list; 
    MyData data; 

    data.binario = 1; 
    data.ch = 'A'; 
    data.charge = 10; 
    list.InsertBegining(data); 

    data.binario = 2; 
    data.ch = 'B'; 
    data.charge = 20; 
    list.InsertBegining(data); 

    list.Print(); 

    system("pause"); 
    return 0; 
} 

別の方法:

あなたがそうMyDataが自分自身を印刷する方法を知っているMyData

struct MyData 
{ 
    int charge; 
    int binario; 
    char ch; 

    friend std::ostream& operator<< (std::ostream &out, MyData &x) 
    { 
     out << x.ch << ", " << x.binario << ", " << x.charge; 
     return out; 
    } 
}; 

ため<<演算子オーバーロードを追加することができます。例:

MyData data; 
data.ch = 'A'; 
data.binario = 1; 
data.charge = 10; 
cout << data << "\n"; 

これは"A, 1, 10"を出力します。

次にあなたがlinkList::Print()linkedList

... 
void Print() 
{ 
    Node<DataType> *walk = first; 
    while (walk) 
    { 
     std::cout << walk->data << "\n"; 
     walk = walk->Next; 
    } 
} 

に変更することができは限り MyData<<演算子オーバーロードがあります(そしてそのデータはPODである)として MyDataとは無関係です。このリンクされたリストを基本タイプに使用することもできます。例:

linkedList<int> test; 
test.InsertBegining(1); 
test.InsertBegining(2); 
test.Print(); 
+0

それは素晴らしいです!しかし、私はまだいくつかの質問がありますが、テンプレートを使用するたびに構造体を宣言しなければなりませんか? – Twhite1195

+0

これは非常に基本的な質問です。どのように動作するかを考え、何が効果的かを見るためにさまざまな場所で宣言を試みます。 'MyData'をグローバルスコープで宣言し、どこでも使用できます。 –

+0

私はそれを考えましたが、テンプレートは私に最初に尋ねるべきですが、私にそのような頭痛を与えているので。いずれにせよ、私を助けてくれてありがとう、私は今、それを掛けていると思うよ – Twhite1195

関連する問題