模板化 LinkedList/Stack,行不通!

发布于 2024-11-26 11:58:30 字数 4588 浏览 0 评论 0原文

我正在尝试临时化链接列表(/stack/queue)以接受 int 和 double 。但到目前为止我还无法让我的代码工作。 (我拿出列表/队列成员函数来简单地尝试让它工作/在构建时不给出错误。所以它主要只是堆栈的东西。)没有“模板东西”代码可以正常工作。如果我错过了什么或者需要添加什么LMK!

我得到的错误:

1>LinkedList_Stack.obj :错误 LNK2019:无法解析的外部符号“public: __thiscall NumberList::~NumberList(void)” (??1?$NumberList@H@@QAE@XZ) 在函数 _main

1> 中引用;LinkedList_Stack.obj:错误LNK2019:无法解析的外部符号“public:void __thiscall NumberList::pop(int &)" (?pop@?$NumberList@H@@QAEXAAH@Z) 在函数 _main

1>LinkedList_Stack.obj 中引用:错误 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 error LNK1120: 3 unresolved externals

我在这个网站上阅读了 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;
}

I'm trying to tempalitize a linkedlist(/stack/queue) to accept int and double. But so far I can't get my code to work. (I took out the list/queue member functions to simply try and get it to work/not give errors when building. So it's mainly just the stack stuff.) Without the "template stuff" code works fine. If I missed anything or need to add anything LMK!

Errors I get our:

1>LinkedList_Stack.obj : error LNK2019: unresolved external symbol "public: __thiscall NumberList::~NumberList(void)" (??1?$NumberList@H@@QAE@XZ) referenced in function _main

1>LinkedList_Stack.obj : error LNK2019: unresolved external symbol "public: void __thiscall NumberList::pop(int &)" (?pop@?$NumberList@H@@QAEXAAH@Z) referenced in function _main

1>LinkedList_Stack.obj : error LNK2019: unresolved external symbol "public: void __thiscall NumberList::push(int)" (?push@?$NumberList@H@@QAEXH@Z) referenced in function _main

1>F:\Documents and Settings\Riotson\Desktop\LinkList\LinkedList_Stack_Queue_BNS11\Debug\LinkedList_Stack_Queue_BNS11.exe : fatal error LNK1120: 3 unresolved externals

I read 3 different post on this site and tried to mimic that for tempaltizing (Where to place the 's and what not) but couldnt' get it to work =. Help please!!!

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

Main:

#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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

沙沙粒小 2024-12-03 11:58:30

不要将模板函数放在 .cpp 中。将它们与头文件放在一起。

Don't put template functions in a .cpp. Put them in with the header file.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文