2016-11-05 61 views
1

我需要建立一个链接列表与模板,但我不知道为什么不工作,我已经建立链接列表之前,但从来没有模板。现在我的问题是,如果我创建的列表中一切正常,但是当我尝试插入的东西给它,我得到以下错误:链接列表模板

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 

我下面的代码:

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

//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 yep,对不起,翻译错误。谢谢指出它 – Twhite1195

+0

什么是'Siguiente'?也没有定义'D类'。'listaSimple NewList'全错了,你可能是指'linkedList NewList',我的'D'是一些没有显示的类。 –

回答

1

NodelinkedList修正版本。请注意,NodelinkedList不包含有关实际数据的任何信息。事实上,你可以在最后申报数据(struct MyData)。

对于印刷我添加了一个功能:

node->data.print(); 

这样NodelinkedList不用于打印数据直接负责,他们并不需要知道数据什么。他们可以要求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

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知道如何打印自己。例如:

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

这应打印"A, 1, 10"

然后你可以改变linkList::Print()

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

现在linkedList是独立的MyData只要MyData具有<<运算符重载(和它的数据是POD)。您也可以将此链接列表用于基本类型。例如:

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

太棒了!但是我仍然有一些问题,每次我想要使用模板时,是否必须声明一个结构? – Twhite1195

+0

这是一个非常基本的问题,考虑它是如何工作的,并尝试在不同的地方申报,看看有什么作用。你可以在全局范围声明'MyData'并在任何地方使用它。 –

+0

我想到了这一点,但由于模板让我头痛,所以我应该先问一下。无论如何,感谢您帮助我,我想我现在得到它的挂钩 – Twhite1195