2014-10-20 47 views
-1

在stack.h中,我有兩個結構Stack和StackElement。在StackElement中,我有一個指向下一個和一個值的指針。所以,我想,我的價值可能是所有類型,例如字符堆棧,雙打堆棧等等。所以,我使用了模板,但有一個錯誤「使用類模板'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; 
} 

請幫我弄清楚,其中的錯誤是。 在此先感謝。

+0

請發佈一個MCVE。大部分代碼與問題無關。 – juanchopanza 2014-10-20 08:17:35

回答

0

您應該指定StackElement這樣的類型:

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

但我想StackElement是所有類型,不只是char或int,或者其他東西。 – ratkke 2014-10-20 08:19:30

+0

那麼你將不得不使'Stack'成爲一個模板結構。像阿德里安·梅說的那樣。 – rashmatash 2014-10-20 08:20:11

0

嘗試:

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

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

但話又說回來,你真的需要兩個類?這是一個鏈表。鏈表與它的頭是同義的。

1

您的StackElement類是一個模板,但Stack不是。更改Stack定義是

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

,並從那裏走。

+0

好的,謝謝,但我怎麼需要改變所有的功能,如 無效推(堆棧*堆棧,字符值); 工作? void push(Stack * stack,char value); 不起作用。 – ratkke 2014-10-20 08:24:06

+0

@ratkke是的,您現在需要在所有函數定義的開始處放置'template ',這很痛苦。你可以通過將'push()'等定義爲'Stack '的成員函數(概念上是這樣)並在類中編寫定義來解決它。 – 2014-10-20 08:26:43