2014-03-30 68 views
-1

我正在編譯兩個文件,旨在構造和測試模板化堆棧類。 .h文件包含兩個ifndef結構,一個用於節點結構,另一個用於堆棧類。在單獨的節點和堆棧ifndefs是分配的要求,因爲措辭:in C++ - h文件中的兩個ifndef結構導致錯誤c2955使用類模板需要模板參數列表

名稱的Stack類,並在名爲Stack.h文件寫入其規格和功能 模板。使用動態數組或鏈接列表來實現該類,並確保包含動態的 內存管理。如果您使用鏈接列表,請使用Node作爲節點 結構名稱,並將其包含在Stack.h中,確保將其包含在其自己的#ifndef NODE/#endif容器的 中 - 這將防止編譯器 問題稍後寫一個隊列模板。

的問題我有,或者至少,我有問題之一,就是當我去編譯,我收到「錯誤c2955:‘堆’:使用類tempate的需要模板參數列表「(可能還有其他錯誤,但這是我覺得我需要先解決的主要問題之一)。這似乎是兩個ifndefs之間的問題?我會很感激任何人都可以幫助我。

Stack.h

#ifndef Node 
#define Node 

template <class DataType> 
struct Node 
{ 
    DataType data; 
    Node<DataType>* next; 
}; 

#endif 




#ifndef Stack_h 
#define Stack_h 

template <class DataType> 
class Stack 
{ 
    private: 
    Node<DataType>* start; 
    Node<DataType>* end; 


    public: 
    // constructors (inline) 
    Stack() 
    :start(0) 
    { 

    } 

    // getters (inline) 
    bool isEmpty() const 
    { 
     return 0 == start; 
    } // getter 

    // setters 
    /* push */ void Stack<DataType>::push(const DataType& parameter); 
    /* peek */ bool Stack<DataType>::peek(DataType& parameter) const; 
    /* pop */ bool Stack<DataType>::pop(DataType& parameter); 
    /* empty */ void Stack<DataType>::makeEmpty(); 




}; 

template <class DataType> 
void Stack<DataType>::push(const DataType& parameter) 
{ 
    Node<DataType>* node = new Node<DataType>; 
    node->data = parameter; 
    node->next = start; 
    start = node; 
} 

template <class DataType> 
bool Stack<DataType>::peek(DataType& parameter) const 
{ 
    if (0 == start) return false; // failed 
    parameter = start->data; 
    return true; // success 
} 

template <class DataType> 
bool Stack<DataType>::pop(DataType& parameter) 
{ 
    if (0 == start) return false; // failed 
    parameter = start->data; 
    Node<DataType>* p = start->next; 
    delete start; 
    start = p; 
    return true; // success 
} 

template <class DataType> 
void Stack<DataType>::makeEmpty() 
{ 
    Node<DataType>* p; 
    while (start) 
    { 
    p = start->next; 
    delete start; 
    start = p; 
    } 
} 


#endif 

StackDriver.cpp

#include <iostream> 

using namespace std; 

#include "Stack.h" 
#include "Stack.h" // testing ifndef 


int main() 
{ 


    cout << "Testing: creating a new int stack, adding one data value to it, then retrieving (via peep) that data" << endl << endl; 

    cout << "Data to be added - 100, same data should be returned" << endl << endl; 

    Stack aStack<int>; 

    aStack.push(100); 

    int dataReturn; 

    aStack.peek(dataReturn); 

    cout << "returned data is " << dataReturn << endl << endl; 



} 
+1

它不是'Stack aStack ;''Stack' aStack;'。 – Chnossos

+0

這實際上是解決方案。這種情況很容易發生,但如果你願意將此作爲答案發布,我很樂意將其標記爲解決方案。 –

回答

1

錯誤

使用類tempate的需要模板參數列表

表明您實際上試圖使用你的類不專業吧:

Stack aStack<int>;改爲Stack<int> aStack;

+0

感謝您的解釋btw,這使得現在更有意義。我猜想我被固定在兩個#ifndef位上,因爲我不熟悉這個,並期望它出錯,我真的應該檢查更多世俗的錯誤。 –

1

這是一個問題:

#define Node 

template <class DataType> 
struct Node 
{ 

的第一線,使不受任何被替換的令牌替換Node

所以當編譯器獲取到你以後的代碼,它只是認爲:

template <class DataType> 
struct 
{ 

你想要的東西沒有做,並導致你的錯誤。

要解決這個問題,請正確使用include guard。每個頭文件只能使用一個警衛。守衛的目的是讓編譯器知道如果它已經讀過它就不會讀這個頭文件。

我還建議在所有大寫的情況下使用一個名稱,以便文件中包含的警衛和有效令牌之間沒有碰撞的機會。頭文件應該是這樣的:

// (First line of header) 
#ifndef H_STACK 
#define H_STACK 

// all code goes here 

#endif // H_STACK 
// (last line of header) 
+0

該賦值的需求指定使用兩個單獨的包含守護,儘管一個用於類,另一個用於結構,並且它們都在相同的.h文件中 –

+0

那麼,這是排名最奇怪的之一僞造分配限制。選擇一個不與任何東西發生衝突的名稱。 –

相關問題