【发布时间】:2015-03-21 20:54:57
【问题描述】:
我已经制作了一个基本的链表,该列表最初包含整数,我正在尝试将列表更改为模板类。
我的节点类叫TLLNode,
TLLNODE.h
#pragma once
template<class T>
class TLLNode{
friend class TLL;
public:
TLLNode(T data);typedef TLLNode<T>* TLLPtr;
private:
TLLNode<T> data;
TLLNode *next;
};
template<class T>
TLLNode<T>::TLLNode(T dataIn) : data(dataIn){
}
template<class T>
using TLLNode<T>* TLLPtr;
我初始化和实现我的函数的列表类被称为TLL
TLL.h
#pragma once
#include <iostream>
#include"TLLNode.h"
using std::cout;
using std::endl;
template<class T>
class TLL{
public:
TLL();
TLL(const TLL&);
void insert(T);
void display();
~TLL();
private:
TLLPtr head;
TLLPtr newNode;
TLLPtr curr;
int size;
};
template<class T>
TLL<T>::TLL() : head(NULL), size(0){
}
// Not implemented yet
template<class T>
TLL<T>::TLL(const TLL& obj){
}
template<class T>
void TLL<T>::insert(T data){
if (head == NULL)
head = new TLLNode(data);
else{
newNode = new TLLNode(data);
newNode->next = head;
head = newNode;
}
}
template<class T>
void TLL<T>::display(){
curr = head;
while (curr != NULL){
cout << curr->data << endl;
curr = curr->next;
}
}
template<class T>
TLL<T>::~TLL(){
while (head != NULL){
curr = head;
head = head->next;
delete curr;
}
}
当列表是 int 类型时,我一直在使用 typedef TLLNode* TLLPtr;,但模板的 typedef 似乎是非法的。
我已经尝试了几种不同的方法来让它工作,但无法让任何解决方案工作,我遇到了这篇文章 using,我尝试使用此解决方案没有成功,代码似乎与我想要做的相同,禁止使用指针。
我还没有尝试在那篇文章中使用结构的旧解决方案。 两种解决方案都对我有用吗?如果没有,是否有替代方案?
我意识到除了我正在讨论的问题之外,我的代码中可能存在错误,我想尝试找出我自己的错误,所以如果它与我的问题无关或直接阻止我继续,我'到时候我会想办法的。
【问题讨论】:
-
你的编译器支持 c++11 吗?
-
@ Jonathan Potter,Visual Studio 2013,很确定我的编译器支持 c++11
-
@Johntk
从技术上讲,它是一个类模板而不是模板类。 “模板的 typedef 似乎是非法的”到底是什么意思?您应该能够在TLL类模板中声明typedef TLLNode<T>* TLLPtr。没有必要在给定这段代码的TLLNode类中声明它,但如果你这样做并想在TLLNode之外使用它,语法会变得有点混乱:typename TLLNode<T>::TLLPtr。 -
@JorenHeit 我已经更正了标题,我使用了“似乎”这个词,因为我不能 100% 确定以我通常的方式使用 typedef 是可能的,你是说它是吗?我将 typedef 移动到 TLL 并查看我得到的里程数。
-
@Johntk 你肯定可以,但是你需要使用
typename关键字来让编译器相信你引用的TLLNode<T>中的字段是一个类型而不是别的东西。因此,如果您有选择,也许只是在TLL中声明它更有意义。虽然 C++11 的解决方案肯定更干净,但知道如何在 C++11 之外解决这些问题永远不会有坏处。
标签: c++ templates pointers typedef