2011-01-01 25 views
7

tôi cố gắng thiết kế mẫu cho dự án đại học của mình. i đã viết mã follwing:mẫu lớp 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); 

templete này sử dụng lớp liên kết 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' 

tôi không hiểu vấn đề là gì. tôi thực sự có thể sử dụng sự giúp đỡ của bạn cảm ơn bạn :)

Trả lời

14

Những thông báo lỗi thực sự thuộc về nhau:

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

Điều này có nghĩa rằng trong dòng 41, bạn giới thiệu một mẫu tham số L; trong bản sao của tôi, điều này đề cập đến

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

Và tuyên bố rằng bóng tối tham số mẫu trong dòng 26:

template <class L>//error one 
class LinkedList 

Bạn cần phải đổi tên các tham số mẫu trong việc kê khai làm bạn.

Sửa: Đặc tả ngôn ngữ có liên quan là 14.6.1/7

Mẫu tham số không được redeclared trong phạm vi của nó (bao gồm phạm vi lồng nhau). Mẫu tham số sẽ không có cùng tên với tên mẫu .

Khi bạn tham khảo L trong const LinkedList<L> listToprint, không rõ bạn có ý nghĩa L của bạn bè hoặc L của lớp học hay không. Vì vậy, viết

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

xin lỗi nhưng tôi không hiểu những gì tôi cần đổi tên và tại sao? –

+0

@inna karpasas: Xem chỉnh sửa của tôi. –

3

Chỉ cần loại bỏ các

template <class L> 

từ khai báo hàm friend thành viên.

Bạn cũng cần thay thế việc sử dụng ostream bằng std::ostream trừ khi bạn có mã số using namespace std ở đâu đó trong mã của mình.

Nếu không, mã sẽ ổn.

+0

nó cho tôi lỗi" khai báo của 'lớp L '" –

+0

@inna karpasas: Thật khó mà không có toàn bộ mã để kiểm tra, nhưng câu trả lời @nimrodm là đúng. Có thể bạn không muốn kết bạn với một toán tử 'tem <<' nhưng một toán tử '' duy nhất có các kiểu thích hợp.Lý do cho lỗi tiếp theo bạn nhận được có thể là về bất kỳ thứ gì không được hiển thị trong câu hỏi làm cho trình phân tích cú pháp nhầm lẫn. –

Các vấn đề liên quan