关于模板类嵌套程序的问题

qq_35276837 2018-01-02 08:05:47


#include "stdafx.h"
using namespace std;

template <class T>
class Queue
{
private:
class Node
{
public:
T item;
Node * next;
Node(T & t) :item(t), next(nullptr) {}
};
Node * head;
Node * rear;
public:
Queue() :head(nullptr), rear(nullptr) {}
void enQueue(const T & t);
void deQueue(T & t);
void Show();
~Queue();
};

template <class T>
void Queue<T>::enQueue(const T & t)
{
Node * new_node = new Node(t);
if (!head)
head = new_node;
rear->next = new_node;
rear = new_node;
}

template <class T>
void Queue<T>::deQueue(T & t)
{
if (!head)
cout << "no elements popped..." << endl;
else
{
t = head->item;
Node * temp = head;
head = head->next;
delete temp;
}
}

template <class T>
void Queue<T>::Show()
{
Node * temp = head;
while (temp)
{
cout << temp->item << " at " << (void *)temp << endl;
temp = temp->next;
}
}

template <class T>
Queue<T>::~Queue()
{
Node * temp = head;
while (temp)
{
head = head->next;
delete temp;
temp = head;
}
}

int main()
{
Queue<int> q;
q.enQueue(1);
q.enQueue(10);
q.Show();

return 0;
}


代码如上,是Queue模板类嵌套了一个Node类,但在enQueue()函数和deQueue()函数中输入rear->后不会自动出现_item和next等Node中的成员(编译器是vs2017),也就是说编译器不知道rear指针能指向它们。如果把模板去掉则编译器能够识别rear->后可加的成员。请问我加入模板后是哪里语法有错误吗?谢谢指教!
...全文
292 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35276837 2018-01-03
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
模板有些内容要到编译时才去验证,所以输入时可能不会自动补全,只要能够正常编译,就没有问题
编译没有错误,可是一运行就会出现如下的错误:

请问这是为什么?
paschen 2018-01-03
  • 打赏
  • 举报
回复
此外,构造函数Node(T & t)应改成Node(const T & t)
paschen 2018-01-03
  • 打赏
  • 举报
回复
模板有些内容要到编译时才去验证,所以输入时可能不会自动补全,只要能够正常编译,就没有问题
qq_35276837 2018-01-03
  • 打赏
  • 举报
回复
引用 5 楼 paschen 的回复:
[quote=引用 4 楼 qq_35276837的回复:][quote=引用 2 楼 paschen 的回复:] 模板有些内容要到编译时才去验证,所以输入时可能不会自动补全,只要能够正常编译,就没有问题
编译没有错误,可是一运行就会出现如下的错误: 请问这是为什么?[/quote] 编译器找不到对应的实现部分,但我编译你的代码是没问题的[/quote]好的感谢
paschen 2018-01-03
  • 打赏
  • 举报
回复
引用 4 楼 qq_35276837的回复:
[quote=引用 2 楼 paschen 的回复:]
模板有些内容要到编译时才去验证,所以输入时可能不会自动补全,只要能够正常编译,就没有问题
编译没有错误,可是一运行就会出现如下的错误:

请问这是为什么?[/quote] 编译器找不到对应的实现部分,但我编译你的代码是没问题的
真相重于对错 2018-01-02
  • 打赏
  • 举报
回复
// queue.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include "stdafx.h"
#include <iostream>
using namespace std;
 
template <class T>
class Queue
{
private:
    class Node
    {
    public:
        T item;
        Node * next;
        Node(T  t) :item(t), next(nullptr) {}
    };
    Node * head;
    Node * rear;
public:
    Queue() :head(nullptr), rear(nullptr) {}
   // void enQueue(const T & t);
	void enQueue(T t);
    void deQueue(T & t);
    void Show();
    ~Queue();
};
 
//template <typename T>
//void Queue<T>::enQueue(const T & t)
//{
//    Node * new_node = new Node(t);
//    if (!head)
//        head = new_node;
//    rear->next = new_node;
//    rear = new_node;
//}
template <typename T>
void Queue<T>::enQueue( T  t)
{
    Node * new_node = new Node(t);
    if (!head)
        head = new_node;
    rear->next = new_node;
    rear = new_node;
}
 
template <class T>
void Queue<T>::deQueue(T & t)
{
    if (!head)
        cout << "no elements popped..." << endl;
    else
    {
        t = head->item;
        Node * temp = head;
        head = head->next;
        delete temp;
    }
}
 
template <class T>
void Queue<T>::Show()
{
    Node * temp = head;
    while (temp)
    {
        cout << temp->item << " at " << (void *)temp << endl;
        temp = temp->next;
    }
}
 
template <class T>
Queue<T>::~Queue()
{
    Node * temp = head;
    while (temp)
    {
        head = head->next;
        delete temp;
        temp = head;
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
	 Queue<int> q;
    q.enQueue(1);
    q.enQueue(10);
    q.Show();
	return 0;
}

微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 微信小程序系统教程共有“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]——核心技术”、“微信小程序系统教程[阶段]客服消息+微信支付+九宝电商系统”。 “微信小程序系统教程[阶段]全套课程”包含: 1.微信小程序系统教程[阶段]_客服消息 2.微信小程序系统教程[阶段]_微信支付 3.微信小程序系统教程[阶段]_九宝电商系统 学习“微信小程序系统教程[阶段]”要求有微信小程序的基础。建议先学习“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]”,后在报名“微信小程序系统教程[阶段]”。 阶段讲解的客服消息,是针对小程序的。后台程序用接近底层的技术,没有使用三方技术。这样降低同学们学习成本。 微信支付,这部分课程很有难度,要求同学们认真听讲,有不会的技术问题可以请教老师。购买课程后请联系老师,提供单号,给你源程序。 九宝电商系统是一套十分适和学习、项目的课程。既可以系统的学习微信小程序相关知识,还可以修改后上线。 “微信小程序系统教程[中级阶段]——核心技术”重点讲解微信小程序事件、组件、API 微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 购买课程的同学,可赠送就九宝老师编写的《微信小程序开发宝典》。 购课请咨询qq2326321088

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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