2011-07-28 5 views
0

私はintとdoubleを受け入れるためにリンクリスト(/スタック/キュー)をtempalitizeしようとしています。しかし、これまでのところ私はコードを動作させることができません。 (私はリスト/キューメンバ関数を取り出して、単にそれを動作させる/ビルド時にエラーを出さないようにしたので、主にスタックのものです) "template stuff"コードがうまくいきません。もし私が何かを見逃したり、何かを追加する必要があれば、LMK!LinkedList/Stackをテンプレート化しても機能しません!

1> LinkedList_Stack.obj:エラーLNK2019:未解決の外部シンボル "パブリック:__thiscall NumberList ::〜NumberList(無効)"?(?? 1 $ NumberList @ H @@ QAE私たちを得る

エラー@XZ)

1> LinkedList_Stack.obj _main機能で参照:エラーLNK2019:未解決の外部シンボル "パブリック:無効__thiscall NumberList ::ポップ(&をint型)"(ポップ@ $ NumberList @ H @@ QAEXAAH @? Z)は、関数_mainで参照されています

1> LinkedList_Stack.obj:エラーLNK2019:未解決の外部シンボル "public:void __thiscall NumberList :: push関数_mainで参照されている

1> F:\ Documents and Settings \ Riotson \ Desktop \ LinkList \ LinkedList_Stack_Queue_BNS11 \ Debug \ LinkedList_Stack_Queue_BNS11.exe:fatalエラーLNK1120:3つの未解決の外部

私はこのサイトで3つの異なる投稿を読み、それを模倣しようとしました(どこに置かれていて何がないか)。助けてください!!!

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