2011-01-01 23 views
7

intento diseñar una plantilla para mi proyecto universitario. Escribí el código siguientes aparatos:plantilla clase C++

#ifndef _LinkedList_H_ 
#define _LinkedList_H_ 
#include "Link.h" 
#include <ostream> 
template <class L>//error one 
class LinkedList 
{ 
private: 
Link<L> *pm_head; 
Link<L> * pm_tail; 
int m_numOfElements; 
Link<L>* FindLink(L * dataToFind); 
public: 
LinkedList(); 
~LinkedList(); 
int GetNumOfElements(){return m_numOfElements;} 
bool Add(L * data); 
L *FindData(L * data); 

template <class L> friend ostream & operator<<(ostream& os,const LinkedList<L> listToprint);//error two 
    L* GetDataOnTop(); 
    bool RemoveFromHead(); 
    L* Remove(L * toRemove); 

este templete utiliza la clase de enlace templete

#ifndef _Link_H_ 
#define _Link_H_ 
template <class T>//error 3 
class Link 
{ 
private: 
T* m_data; 
Link* m_next; 
Link* m_prev; 
public: 
Link(T* data); 
~Link(void); 
bool Link::operator ==(const Link& other)const; 

/*getters*/ 
Link* GetNext()const {return m_next;} 
Link* GetPrev()const {return m_prev;} 
T* GetData()const {return m_data;} 
//setters 
void SetNext(Link* next) {m_next = next;} 
void SetPrev(Link* prev) {m_prev = prev;} 
void SetData(T* data) {m_data = data;} 

}; 

error one: shadows template parm `class L' 
error two:declaration of `class L' 
error three: shadows template parm `class T' 

No entiendo cuál es el problema. i puede utilizar realmente su ayuda ti :)

Respuesta

14

Estos mensajes de error gracias realmente pertenecen juntos:

a.cc:41: error: declaration of ‘class L’ 
a.cc:26: error: shadows template parm ‘class L’ 

Esto significa que en la línea 41, se introduce un parámetro de plantilla L; en mi copia, esto se refiere a

template <class L> friend ostream & operator<<(ostream& os, 
       const LinkedList<L> listToprint);//error two 

Y esa declaración sombras del parámetro de plantilla en la línea 26:

template <class L>//error one 
class LinkedList 

Es necesario cambiar el nombre del parámetro de plantilla en la declaración amigo.

Editar: La especificación del lenguaje relevante es 14.6.1/7

A-parámetro de plantilla no será redeclarada dentro de su alcance (incluyendo ámbitos anidados). Un parámetro de plantilla no debe tener el mismo nombre que el nombre de la plantilla .

Cuando se hace referencia a L en const LinkedList<L> listToprint, no está claro si nos referimos a la L del amigo o la L de la clase. Así que escribe

template <class L1> friend ostream & operator<<(ostream& os, 
    const LinkedList<L1> listToprint); 
+0

lo siento, pero no entiendo lo que tengo que cambiar el nombre y por qué? –

+0

@inna karpasas: Ver mi edición. –

3

Basta con retirar la

template <class L> 

de la declaración de la función friend miembro.

También necesita reemplazar usos de ostream con std::ostream a menos que tenga un using namespace std en algún lugar de su código.

De lo contrario, el código se ve bien.

+0

me da el error" declaration de 'clase L '" –

+0

@inna karpasas: Es difícil sin todo el código para probar, pero la respuesta de @nimrodm es correcta. Probablemente no quiera hacerse amigo de un 'operador << con plantilla 'sino de un' operador << 'que tome los tipos apropiados.La razón del próximo error que está recibiendo puede ser sobre cualquier cosa que no se muestra en la pregunta que confunde al analizador. –

Cuestiones relacionadas