struct中的模板问题

时间:2014-10-20 08:15:13

标签: c++ templates stack

在stack.h中,我有两个结构,Stack和StackElement。在StackElement中,我有一个指向下一个和一个值的指针。所以,我想,我的值可能是所有类型,例如char的堆栈,双打堆栈等等。所以,我使用了模板,但是有一个错误“使用类模板'StackElement'需要模板参数” 。这是代码:

#pragma once

template <typename T>
struct StackElement
{
    T value;
    StackElement *next;
};


struct Stack
{
    StackElement *top;
};

Stack *createStack();
void push(Stack *stack, char value);
char pop(Stack *stack);
void deleteStack(Stack *stack);
bool isEmpty(Stack *stack);
char check(Stack *stack);

此外,在上面的所有函数中,我都有相同的错误,其中StackElement的值为:

#include "stack.h"

template <typename T>
StackElement *createStackElement(T value, StackElement *next)
{
    StackElement *newStackElement = new StackElement;
    newStackElement->next = next;
    newStackElement->value = value;
    return newStackElement;
}


Stack *createStack()
{
    Stack *newStack = new Stack;
    newStack->top = createStackElement(0, nullptr);
    return newStack;
}


void push(Stack *stack, T value)
{
    StackElement *newElement = createStackElement(value, stack->top->next);
    stack->top->next = newElement;
}


char check(Stack *stack)
{
    return stack->top->next->value;
}

char pop(Stack *stack)
{
    char result = stack->top->next->value;
    StackElement *element = stack->top->next;
    stack->top->next = stack->top->next->next;
    delete element;
    return result;
}

bool isEmpty(Stack *stack)
{
    return stack->top->next == nullptr;
}

void deleteStack(Stack *stack)
{
    while (!isEmpty(stack))
        pop(stack);
    delete stack->top;
    delete stack;
}

请帮我弄清楚错误在哪里。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

您的StackElement课程是模板,但Stack不是。将Stack定义更改为

template <typename T>
struct Stack
{
    StackElement<T>* top;
};

然后从那里开始。

答案 1 :(得分:0)

您应该像这样指定StackElement的类型:

struct Stack
{
    StackElement<char> *top;
};

答案 2 :(得分:0)

尝试:

template <typename T>
struct StackElement
{
    T value;
    StackElement<T> *next;
};

template <typename T>
struct Stack
{
    StackElement<T> *top;
};

但话又说回来,你真的需要两节课吗?它是一个链表。链表与其头部同义。