【问题标题】:Difficulty with template class模板类的困难
【发布时间】:2012-04-10 10:38:05
【问题描述】:

好的,伙计们,我一直在尝试定义一个 Stack ,每个节点也是模板类型,但是当 prog 尝试编译时,我会遇到十几种不同类型的错误。我将粘贴使用字符类型堆栈并尝试弹出字母'e'的程序

 #ifndef STACK_LIST_H
#define STACK_LIST_H
#include "List.h"

using namespace std;
template <class T>
class Stack {
public:
    T pop();
    void push(T x);
    T isEmpty();
    T top();

private:
    int      size;
    Node<T> *   headNode;
    Node<T> *   currentNode;


};

#endif

现在是函数定义:

    #include <iostream>
#include "Stack_list.h"

using namespace std;
template <class T>
T Stack<T>::pop(){
    T x = headNode->get();
    Node<T>* p = new Node<T>::Node();
    p = headNode;
    headNode = headNode->getNext();
    delete p;
    return x; }

template <class T>
void Stack<T>::push(T x){
    Node<T>* newNode = new Node<T>::Node();
    newNode->setNext(headNode);
    newNode->set(x);
    headNode=newNode;
}

template <class T>
int Stack<T>::isEmpty(){
return (headNode ==NULL);}

template <class T>
T Stack<T>::top(){
return headNode->get();
}

现在是模板类节点:

#ifndef LIST_H
#define LIST_H

using namespace std;

/* The Node class */
template <class T>
class   Node
{
    public:
        Node(T here){object=here;};
        T get() { return   object; };
        void  set(T object) { this->object   =   object; };
        Node<T>* getNext() { return   nextNode; };
        void  setNext(Node<T>* nextNode) { this->nextNode   =   nextNode; };
        Node<T>* getPrev(){ return  prevNode;};
        void  setPrev(Node<T>* prevNode){this->prevNode=prevNode;};
    private:
       T object;
       Node<T>* nextNode;
       Node<T>* prevNode;
};
#endif

最后是调用类的程序:

#include <iostream>
#include "Stack_list.cpp"
using namespace std;

int main(){
Stack <char>s;
s.push("e");
cout<<s.pop();
}

如您所见,这是我第一次尝试模板类。在 Stack::pop() 和 push(T) 的定义中,它说:“‘Node’之前的预期类型说明符”

【问题讨论】:

  • 也许从更简单的开始?
  • 有什么错误?什么定义先到什么,什么包含在哪里?您希望我们如何通过将代码扔给我们来帮助您?
  • 查看我更新的代码并试图在我的问题中更清楚
  • 您应该将代码减少到实际失败的程度,并提供确切的错误消息。

标签: c++ class templates stack


【解决方案1】:

您的方法定义签名是:

T Stack<T>::pop()

但他们应该是

template<typename T>
T Stack<T>::pop()

另外,由于Stack 使用Node,您必须在Stack.h 中包含Node.h

此外 - 在 Stack 中,您声明了 T isEmpty();,但将其实现为 int Stack&lt;T&gt;::isEmpty()。坚持一种返回类型(这里可能bool 更合适,但int 也可以)。

最后:

Stack <char>s;
s.push("e");

模板特化是char,但"e"const char*。正确的做法是:

Stack <char>s;
s.push('e'); // <- note the single quotes

【讨论】:

  • 完成了所有这些,但它在节点的类型规范方面存在问题,我已经更新了代码并将其粘贴在上面,在创建新类型节点的地方包含了节点 跨度>
【解决方案2】:

Node&lt;T&gt;* newNode = new Node() 不一致。 Node 是类还是类模板?第一次提到它,你把它当作一个模板,并用T 实例化它,但第二次你把它当作一个类。不能两者兼有。

【讨论】:

  • 它是一个类模板,不知道如何计算这个赋值操作的右侧,我应该包括 Node* newNode = new Node::Node() 吗?
  • 不;实例化类型的名称是Node&lt;T&gt;,这就是您所需要的新类型:Node&lt;T&gt;* newNode = new Node&lt;T&gt;。是的,对于 C++03,您必须重复自己。在 C++11 中,它只是 auto newNode = new Node&lt;T&gt;
  • 哇,好用!所以我必须在调用构造函数时提到类型.. 非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
相关资源
最近更新 更多