C++中能不能用结构体模板

我想做一个链栈,按设想,链栈用类模板实现,在类中使用到结构体指针。但结构体中的类型应该可变。不知道有没有结构体模板,如果有,请各位方家写出来看下。其次,不知道可不可以在结... 我想做一个链栈,按设想,链栈用类模板实现,在类中使用到结构体指针。但结构体中的类型应该可变。不知道有没有结构体模板,如果有,请各位方家写出来看下。其次,不知道可不可以在结构中再定义一个结构,镶嵌在结构中,并且里面的结构没有预定义。不知道可以不??? 展开
 我来答
匿名用户
推荐于2016-05-15
展开全部
当然可以写结构体模版,标准库中的容器都是类(结构体)模版,有vector,list,queue下面是我模仿标准库写的一个Queue(队列),不过其中的接口跟list提供的接口差不多,你只要把所有出现Queue的地方全部换成list就成了,这个程序用到了类模版的很多知识,类模版的前向声明,函数的前向声明,类模版的特化类模版友元函数的设置等等,需要对类模版这块比较熟悉才成
#ifndef QUEUE_H_#define QUEUE_H_#include <iostream>
template<class T> class Queue;
template<class T> std::ostream &operator<<(std::ostream &, const Queue<T> &);
template<class Type> class QueueItem{ friend class Queue<Type>; friend std::ostream & operator<< <Type>(std::ostream &, const Queue<Type> &); QueueItem(const Type &it): item(it), next(0) { } Type item; QueueItem *next;};
template<class T>class Queue{ friend std::ostream & operator<< <T>(std::ostream &, const Queue<T> &);public: Queue(): head(0), tail(0) { } Queue(const Queue &c); Queue &operator=(const Queue &rhs); template<class Iter> Queue(Iter beg, Iter end): head(0), tail(0) { copy_elements(beg, end); } ~Queue(){ destroy(); }public: template<class Iter> void assign(Iter beg, Iter end); void push(const T &); void pop(); T &front() { return head->item; } const T &front() const { return head->item; } bool empty() const { return head == 0; }private: QueueItem<T> *head; QueueItem<T> *tail; //utility functions used by copy constructor, assignment and destructor void copy_elements(const Queue &); void destroy();private: template<class Iter> void copy_elements(Iter, Iter);};
template<> voidQueue<const char *>::push(const char *const &s){ char *new_item = new char[strlen(s) + 1]; strncpy(new_item, s, strlen(s) + 1); QueueItem<const char *> *p = new QueueItem<const char *>(new_item); if(empty()) head = tail = p; else{ tail->next = p; tail = p; }}
template<> void Queue<const char *>::pop(){ QueueItem<const char *> *p = head; head = head->next; delete []p->item; delete p;}
template<class T>void Queue<T>::push(const T &v){ QueueItem<T> *p = new QueueItem<T>(v); if(empty()){ head = tail = p; }else{ tail->next = p; tail = p; }}
template<class T> void Queue<T>::pop(){ QueueItem<T> *p; p = head; head = head->next; delete p;}
template<class T>Queue<T>::Queue(const Queue &c): head(0), tail(0){ copy_elements(c);}
template<class T>void Queue<T>::copy_elements(const Queue &c){ for(QueueItem<T> *p = c.head; p; p = p->next) push(p->item);}
template<class T> template<class Iter>void Queue<T>::copy_elements(Iter beg, Iter end){ for(; beg != end; ++beg) push(*beg);}
template<class T> template<class Iter>void Queue<T>::assign(Iter beg, Iter end){ destroy(); copy_elements(beg, end);}
template<class T> void Queue<T>::destroy(){ while(!empty()) pop();}
template<class T>Queue<T> &Queue<T>::operator=(const Queue &rhs){ destroy(); copy_elements(rhs); return *this;}
template<class T> inline std::ostream &operator<<(std::ostream &os, const Queue<T> &q){ if(q.empty()) return os; QueueItem<T> *p; os << "< "; for(p = q.head; p; p = p->next) os << p->item << " "; os << ">"; return os;}
template<> inline std::ostream &operator<<(std::ostream &os, const Queue<const char *> &q){ if(q.empty()) return os; QueueItem<const char *> *p; os << "< "; for(p = q.head; p!= q.tail; p = p->next) os << "\"" << p->item << "\"" << ", "; os << "\"" << p->item << "\"" << " >"; return os;}
#endif
百度网友845a16d
2019-07-01
知道答主
回答量:2
采纳率:0%
帮助的人:1297
展开全部

注意只有在定义结构体时那个模板名不需要加模板参数列表<T>,之后应用该模板都应该加<T>

如这里的node<T>

#include <iostream>

#include <stdlib.h>

using namespace std;

template <class T>

struct node{

T data;

node<T>* next;

};

template <class T>

node<T>* CreateList(int len, T a[])

{

node<T>* head = new node<T>;

node<T>* tmp = head;

for (int i = 0; i < len; i++)

{

tmp->data = a[i];

if (i == len - 1)

{

tmp->next = NULL;

continue;

}

node<T> * newNode = new node<T>;

tmp->next = newNode;

tmp = newNode;

}

return head;

}

template <class T>

void Show(node<T>* head)

{

for (node<T> * tmp = head; tmp!= NULL; tmp = tmp->next)

cout << tmp->data << " ";

cout << endl;

}

int main()

{

int a[3] = {1,2,3};

node<int>* head = CreateList(3, a);

Show(head);

return 0;

}

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-04-21
展开全部
我觉得可以这样:

template <typename T>
struct Node
{
T data;
Node* next;
};
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式