2011-07-28 58 views
0

我試圖使一個鏈表(/ stack/queue)的tempalitize接受int和double。但到目前爲止,我無法讓我的代碼工作。 (我拿出list/queue成員函數來簡單地試着讓它工作/不會在構建時給出錯誤,所以它主要是堆棧的東西。)沒有「模板東西」的代碼工作正常。如果我錯過了任何東西或需要添加任何LMK!Templatize LinkedList/Stack,不起作用!

錯誤,我得到我們的:

1> LinkedList_Stack.obj:錯誤LNK2019:解析外部符號? 「市民:__thiscall NumberList ::〜NumberList(無效)」(?? 1 $ NumberList 3 H @@ QAE @XZ)函數引用_main

1> LinkedList_Stack.obj:錯誤LNK2019:解析外部符號? 「市民:無效__thiscall NumberList ::流行(INT &)」(彈出@ $ NumberList 3 H @@ QAEXAAH @ Z)在函數中引用_main

1> LinkedList_Stack.obj:error LNK2019:無法解析的外部符號「public:void __thiscall NumberList :: push( int>)(?push @?$ NumberList @ H @@ QAEXH @ Z)在函數_main中引用

1> F:\ Documents and Settings \ Riotson \ Desktop \ LinkList \ LinkedList_Stack_Queue_BNS11 \ Debug \ LinkedList_Stack_Queue_BNS11.exe:fatal錯誤LNK1120:3個未解決的外部問題

我在這個網站上看到3個不同的帖子,並試圖模仿那個適合tempaltizing(放哪裏和哪些不是)但不能'讓它工作=。請幫助!!!

List.h:

#ifndef LIST_H 
#define LIST_H 
template<class T> 
struct ListNode 
{ 
    T value; // Value in this node 
    struct ListNode<T> *next; // Pointer to the next node 
}; 

    // Class of LinkedList/Stack/Queue 
template<class T> 
class NumberList 
{ 
private: 
    ListNode<T> *head, *rear; // List head pointer 

public: 
    //Constructor 
    NumberList() 
    { head = NULL; rear = NULL; } 

    //Destructor 
    ~NumberList(); 

    // Linked List Operations 
    void displayList() const; 

    //Stack operations 
    void push(T); 
    void pop(T &); 
    bool isEmpty(); 
}; 

template<class T> 
void NumberList<T>::displayList() const 
{ 
    ListNode *nodePtr; 

    nodePtr = head; 

    while(nodePtr) 
    { 
     cout << nodePtr->value << endl; 

     nodePtr = nodePtr->next; 
    } 
} 
template<class T> 
NumberList<T>::~NumberList() 
{ 
    ListNode<T> *nodePtr; 
    ListNode<T> *nextNode; 

    // Position nodePtr at the head of the list 
    nodePtr = head; 

    // While nodePtr is not at the end of the list.... 
    while(nodePtr != NULL) 
    { 
     // Save a pointer to the next node. 
     nextNode = nodePtr->next; 

     // Delete the current node. 
     delete nodePtr; 

     // Position nodePtr at the next node. 
     nodePtr = nextNode; 
    } 
} 

template<class T> 
void NumberList<T>::push(T num) 
{ 
    ListNode<T> *newNode; // Point to a new node 

    // Allocate a new node and store num there. 
    newNode = new ListNode; 
    newNode->value = num; 

    //If there are no nodes in the list 
    // make newNode the first node. 
    if(isEmpty()) 
    { 
     head = newNode; 
     newNode->next = NULL; 
    } 
    else 
    { 
     newNode->next = head; 
     head = newNode; 
    } 
} 

template<class T> 
void NumberList<T>::pop(T &num) 
{ 
    ListNode<T> *temp; // Temporary pointer 

    // First make sure stack isn't empty. 
    if(isEmpty())//Create a DynIntQueue object. 
    { 
     cout << "The stack is empty.\n"; 
    } 
    else // pop value off the top of stack 
    { 
     num = head->value; 
     temp = head->next; 
     delete head; 
     head = temp; 
    } 
} 

// Member function isEmpty returns true if the stack/Queue 
//is empty, or false otherwise. 
template<class T> 
bool NumberList<T>::isEmpty() 
{ 
    bool status; 

    if(!head) 
     status = true; 
    else 
     status = false; 

    return status; 
} 
#endif 

主營:

#include "List.h" 
int main() 
{ int catchVar; // To hold value popped off the stack 

    // Create a Dynamic IntStack object. 
    NumberList<int> stack; 

    // Push values onto stack 
    cout << "Pushing 1, 2, 3\n"; 
    stack.push(1); 
    stack.push(2); 
    stack.push(3); 

    cout << endl; 

    // Pop the values off the stack 
    cout << "Popping...\n"; 
    stack.pop(catchVar); 
    cout << catchVar << endl; 
    stack.pop(catchVar); 
    cout << catchVar << endl; 
    stack.pop(catchVar); 
    cout << catchVar << endl; 

    // Try to pop another value off the stack. 
    cout << "\nAttempting to pop again... " <<endl; 
    stack.pop(catchVar); 
    cout << endl; 

    // Templitization of a Double 
    cout << "Pushing a double of 1.5\n"; 
    stack.push(1.5); 

    cout << endl; 
    cout << "Popping double 1.5...\n"; 
    stack.pop(catchVar); 
    cout << catchVar << endl; 

    cout << "Templitization Succesful\n" << endl; 
    cout << endl; 

    return 0; 
} 

回答

1

不要把模板函數在一個.cpp。把它們放在頭文件中。

+0

@Redinderien那樣?只需將它添加到最後? – Riotson

+0

是的。完全刪除.cpp並將其內容移至標題。模板化的代碼必須在標題中,除非它是專門的,而你的代碼則不是。 – Reinderien

+0

這樣做的竅門!非常感謝!!哈哈哇,我花了好幾個小時試圖弄清楚,呃。再次感謝! – Riotson