我尝试为我的大学项目设计一个模板。我写了以下代码:
#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);
该模板使用链接类模板
#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'
我不明白有什么问题。我真的需要你的帮助
谢谢 :)
这些错误消息确实属于同一组:
a.cc:41: error: declaration of ‘class L’
a.cc:26: error: shadows template parm ‘class L’
这意味着在第41行,你引入了一个模板参数L;在我的副本中,这是指
template <class L> friend ostream & operator<<(ostream& os,
const LinkedList<L> listToprint);//error two
该声明隐藏了第 26 行中的模板参数:
template <class L>//error one
class LinkedList
您需要重命名友元声明中的模板参数。
Edit:相关语言规范为14.6.1/7
模板参数不应是
在其范围内重新声明(包括
嵌套范围)。模板参数
不得与该人同名
模板名称。
当你参考L
in const LinkedList<L> listToprint
,不清楚你指的是朋友的L还是班级的L。所以写
template <class L1> friend ostream & operator<<(ostream& os,
const LinkedList<L1> listToprint);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)