请教一下关于模板的问题,必须这样写吗,不会太麻烦么

乐百川 2014-04-24 11:50:50
#include<iostream>
using namespace std;
template <typename T>
class node
{
T data;
node *next;
public:
node(T d = 0) :data(d), next(NULL)
{

}
template<typename T> friend class list;
};
template <typename T>
class list
{
public:
list() :head(NULL)
{

}
void push(T data);
void print();
private:
node<T> *head;
};
template <typename T>
void list<T>::push(T data)
{
node<T> *s = new node<T>(data);
if (!head)
{
head = s;
return;
}
node<T> *p = head;
while (p->next)
{
p = p->next;
}
p->next = s;
}
template <typename T>
void list<T>::print()
{
node<T> *p = head;
while (p)
{
cout << p->data << endl;
p = p->next;
}
}
int main()
{
list<int> a;
a.push(1);
a.push(2);
a.push(3);
a.push(5);
a.print();
}

程序很简单,两个模板类,一个是节点类,一个是链表类,一开始我在链表类里面写的都是node,然后编译器报错,于是我都改成了node<T>这才对……,必须这样写么?
...全文
222 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
乐百川 2014-04-25
  • 打赏
  • 举报
回复
引用 5 楼 mujiok2003 的回复:
前置申明
抱歉没看懂……,就是加了一个前置声明,不知道有什么用,是我太笨了么……
乐百川 2014-04-25
  • 打赏
  • 举报
回复
引用 4 楼 lm_whales 的回复:
嵌入类型,可以不需要模板参数, 另外,类外定义,可能需要模板参数,类内一般就不需要了. 外部类型需要
在类内定义就可以省去了template 和<T>的声明了吗,我还是得好好看看书呀
乐百川 2014-04-25
  • 打赏
  • 举报
回复
引用 11 楼 guodongxiaren 的回复:
就是嵌套类嘛。在大类里面再定义一个小类。就能使用同一模板T了。小类也要加分号,就这些注意的地方。还有就是友元会破坏封装。使用的时候要慎重。
非常感谢
乐百川 2014-04-25
  • 打赏
  • 举报
回复
引用 10 楼 lm_whales 的回复:
格式一下,看起来不累人 嵌套类的例子,你的代码,改了一下:
#include<iostream>
using namespace std;

template <typename T>
class list
{
public:
	struct node
	{
		T data;
		node *next;
	public:
		node(T d = 0) :data(d), next(NULL){}
		friend class list;
	};
	
	list() :head(NULL){}
	void push(T data){
		node *s = new node(data);
		if (!head){
			head = s;
			return;
		}
		node *p = head;
		while (p->next)
			p = p->next;
		p->next = s;
	}
	void print()
	{
		node *p = head;
		while (p)
		{
			cout << p->data << endl;
			p = p->next;
		}
	}
	private:
		node *head;
};

int main()
{
	list<int> a;
	a.push(1);
	a.push(2);
	a.push(3);
	a.push(5);
	a.print();
	return 0;
}
我好像明白了,非常感谢
果冻虾仁 2014-04-25
  • 打赏
  • 举报
回复
就是嵌套类嘛。在大类里面再定义一个小类。就能使用同一模板T了。小类也要加分号,就这些注意的地方。还有就是友元会破坏封装。使用的时候要慎重。
mujiok2003 2014-04-25
  • 打赏
  • 举报
回复
lm_whales 2014-04-25
  • 打赏
  • 举报
回复
嵌入类型,可以不需要模板参数, 另外,类外定义,可能需要模板参数,类内一般就不需要了. 外部类型需要
wanren13 2014-04-25
  • 打赏
  • 举报
回复
node既然是模板类,在用的时候当然要用尖括号申明类型。
lm_whales 2014-04-25
  • 打赏
  • 举报
回复
格式一下,看起来不累人 嵌套类的例子,你的代码,改了一下:
#include<iostream>
using namespace std;

template <typename T>
class list
{
public:
	struct node
	{
		T data;
		node *next;
	public:
		node(T d = 0) :data(d), next(NULL){}
		friend class list;
	};
	
	list() :head(NULL){}
	void push(T data){
		node *s = new node(data);
		if (!head){
			head = s;
			return;
		}
		node *p = head;
		while (p->next)
			p = p->next;
		p->next = s;
	}
	void print()
	{
		node *p = head;
		while (p)
		{
			cout << p->data << endl;
			p = p->next;
		}
	}
	private:
		node *head;
};

int main()
{
	list<int> a;
	a.push(1);
	a.push(2);
	a.push(3);
	a.push(5);
	a.print();
	return 0;
}
lm_whales 2014-04-25
  • 打赏
  • 举报
回复
嵌套类的例子,对你的代码改了一下: template <typename T> class list { public: struct node { T data; node *next; public: node(T d = 0) :data(d), next(NULL){} friend class list; }; list() :head(NULL){} void push(T data){ node *s = new node(data); if (!head){ head = s; return; } node *p = head; while (p->next) p = p->next; p->next = s; } void print() { node *p = head; while (p) { cout << p->data << endl; p = p->next; } } private: node *head; }; int main() { list<int> a; a.push(1); a.push(2); a.push(3); a.push(5); a.print(); return 0; }
PDD123 2014-04-25
  • 打赏
  • 举报
回复
必须这么写,省不了的。
乐百川 2014-04-24
  • 打赏
  • 举报
回复
还有我一开始写的模板节点类中的友元声明是这样的,然后报错了,可是书上面就是这么写的呀……我一直以为模板这里挺简单的,今天撸了这么一点代码就发现自己原来全不会啊
template<typename T> friend class list<T>;

65,207

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧