【问题标题】:Typedef pointer in a Class Template类模板中的 Typedef 指针
【发布时间】: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&lt;T&gt;* TLLPtr。没有必要在给定这段代码的TLLNode 类中声明它,但如果你这样做并想在TLLNode 之外使用它,语法会变得有点混乱:typename TLLNode&lt;T&gt;::TLLPtr
  • @JorenHeit 我已经更正了标题,我使用了“似乎”这个词,因为我不能 100% 确定以我通常的方式使用 typedef 是可能的,你是说它是吗?我将 typedef 移动到 TLL 并查看我得到的里程数。
  • @Johntk 你肯定可以,但是你需要使用typename 关键字来让编译器相信你引用的TLLNode&lt;T&gt; 中的字段是一个类型而不是别的东西。因此,如果您有选择,也许只是在 TLL 中声明它更有意义。虽然 C++11 的解决方案肯定更干净,但知道如何在 C++11 之外解决这些问题永远不会有坏处。

标签: c++ templates pointers typedef


【解决方案1】:

您应该如下定义TLLPtr

template<class T>
using TLLPtr = TLLNode<T>*;

TLL 的定义中的任何地方都使用TLLPtr&lt;T&gt; 而不仅仅是TLLPtr(并且还将TLLNode 更改为TLLNode&lt;T&gt;)。

更新:我还注意到您在TLLNode 中有TLLNode&lt;T&gt; data;。您不能定义具有类本身类型的类的成员,您的意思可能是T data;

【讨论】:

  • 我发现我的 TLLPtr 中缺少 ,我已经相应地更改了我的代码,但我的代码仍然存在问题,我会先解决它们我将此标记为正确。
  • 我已将其更改为T data;,我收到一个错误:tll.h(21) 类模板已被声明为非类模板”,不知道该怎么做。
  • 这是我的朋友减速,我忘了把它声明为模板。
猜你喜欢
  • 2014-09-17
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多