C++模板链表链接器错误

C++ Template Linked List Linker Error

本文关键字:错误 链接 链表 C++      更新时间:2023-10-16

我认为我不正确地使用我的模板,但我无法弄清楚我做错了什么。就像模板链表无法弄清楚它需要使用我的 Term 类一样。

List->insert(tempPolynomial); 是位于函数末尾的代码行.cpp,导致链接器错误!

以下是Visual Studio 2012中的确切错误:

  • 错误 LNK2019:未解析的外部符号"bool __cdecl运算符<(类术语,类链接列表)"(??M@YA_NVTerm@@V?$LinkedList@VTerm@@@@@Z) 在函数"public: void __thiscall LinkedList::insert(class Term)" (?insert@?$LinkedList@VTerm@@@@QAEXVTerm@@@Z) C:\Users\Michael\Documents\Magic Briefcase\champlain\courseWork\dataStructures\pa2\pa2\functions.obj

  • 错误 LNK1120:1 个未解析的外部 C:\用户\迈克尔\文档\魔术公文包\尚普兰\课程工作\数据结构\pa2\调试\pa2.exe

标题.h

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
#include "linkedList.h"
#include "term.h"
void loadPolynomial(string expression, LinkedList<Term> *theList);

函数.cpp

#include "header.h"

void loadPolynomial(string expression, LinkedList<Term> *theList)
{
    Term tempPolynomial;
    string varDelimiter = "x";
    string posDelimiter = "+";
    string negDelimiter = "-";
    string token = "";
    double coefficient;
    double exponent;
    bool isNeg;
    while(expression.length() > 0)
    {
        isNeg = false;
        if(expression.substr(0, 1) == "+")
        {
            expression.erase(0, 1);
        }
        else if(expression.substr(0, 1) == "-")
        {
            isNeg = true;
            expression.erase(0, 1);
        }
        //Get the coefficient
        token = expression.substr(0, expression.find(varDelimiter));
        //Remove the coefficient and variable from the string leaving only the exponent
        expression.erase(0, expression.find(varDelimiter) + varDelimiter.length());
        //Convert and put token's coeficient into a double
        coefficient = atof(token.c_str());
        if(isNeg = true)
        {
            coefficient = coefficient * -1;
        }
        //Put the coefficient value into the tempPolynomial
        tempPolynomial.setCoefficient(coefficient);
        //If posDelimiter has a smaller length then it is the beginning of the next expression
        if(expression.find(posDelimiter) < expression.find(negDelimiter))
        {
            //Get the exponent
            token = expression.substr(0, expression.find(posDelimiter));
            //Remove the exponent but leave the + 
            expression.erase(0, expression.find(varDelimiter));
            //Convert and put token's coeficient into a double
            exponent = atof(token.c_str());
        }
        else
        {
            //Get the exponent
            token = expression.substr(0, expression.find(posDelimiter));
            //Remove the exponent but leave the +
            expression.erase(0, expression.find(varDelimiter));
            //Convert and put token's coeficient into a double
            exponent = atof(token.c_str());
        }
        //Put the exponent value into the tempPolynomial
        tempPolynomial.setExponent(exponent);
        //Intert the first term into the linked list
        theList->insert(tempPolynomial);
    }
}

linkedList.h

#ifndef LINKED_LIST_H
#define LINKED_LIST_H
#include <iostream>
#include <fstream>
using namespace std;
template <class T>
class LinkedList
{
private:
    T mData;
    LinkedList<T> *mNext;
public:
    LinkedList();
    LinkedList(T data);
    ~LinkedList();
    T getData();
    LinkedList<T> *getNext();
    void setData(T data);
    void display();
    void insert(T data);
    bool isExist(T data);
    void remove(T data);
    friend ostream& operator<<(ostream &output, LinkedList<T> obj);
    bool operator==(T right);
    friend bool operator==(T left, LinkedList<T> right);
    bool operator!=(T right);
    friend bool operator!=(T left, LinkedList<T> right);
    bool operator>(T right);
    friend bool operator>(T left, LinkedList<T> right);
    bool operator<(T right);
    friend bool operator<(T left, LinkedList<T> right);
};

template <class T>
LinkedList<T>::LinkedList()
{
    mNext = NULL;
    mData = T();
}

template <class T>
LinkedList<T>::LinkedList(T data)
{
    mNext = NULL;
    mData = data;
}

template <class T>
LinkedList<T>::~LinkedList()
{
    LinkedList<T> *tempNode;
    tempNode = mNext;
    while(tempNode != NULL)
    {
        mNext = tempNode->mNext;
        tempNode->mNext = NULL;
        delete tempNode;
        tempNode = mNext;
    }
}

template <class T>
T LinkedList<T>::getData()
{
    return mData;
}

template <class T>
LinkedList<T> *LinkedList<T>::getNext()
{
    return mNext;
}

template <class T>
void LinkedList<T>::setData(T data)
{
    mData = data;
}

template <class T>
void LinkedList<T>::display()
{
    LinkedList<T> *tempNode;
    tempNode = mNext;
    while(tempNode != NULL)
    {
        cout << tempNode->mData << endl;
        tempNode = tempNode->mNext;
    }
}

template <class T>
void LinkedList<T>::insert(T data)
{
    LinkedList<T> *previousNode;
    LinkedList<T> *tempNode;
    LinkedList<T> *newNode;
    newNode = new LinkedList(data);
    if(mNext == NULL)
    {
        mNext = newNode;
    }
    else
    {
        previousNode = mNext;
        tempNode = mNext;
        while(tempNode != NULL && tempNode->mData < data)
        {
            previousNode = tempNode;
            tempNode = tempNode->mNext;
        }
        if(tempNode == mNext)
        {
            newNode->mNext = mNext;
            mNext = newNode;
        }
        else
        {
            previousNode->mNext = newNode;
            newNode->mNext = tempNode;
        }
    }
}

template <class T>
bool LinkedList<T>::isExist(T data)
{
    LinkedList<T> *tempNode;
    bool exist = false;
    tempNode = mNext;
    while(tempNode != NULL)
    {
        if(tempNode->mData == data)
        {
            exist = true;
            break;
        }
        tempNode = tempNode->mNext;
    }
    return exist;
}

template <class T>
void LinkedList<T>::remove(T data)
{
    LinkedList<T> *tempNode;
    LinkedList<T> *previousNode;
    if(isExist(data) == false)
    {
        return;
    }
    tempNode = mNext;
    previousNode = mNext;
    while(tempNode->mData != data)
    {
        previousNode = tempNode;
        tempNode = tempNode->mNext;
    }
    if(tempNode == mNext)
    {
        mNext = tempNode->mNext;
        tempNode->mNext = NULL;
    }
    else
    {
        if(tempNode->mNext == NULL)
        {
            previousNode->mNext = NULL;
        }
        else
        {
            previousNode->mNext = tempNode->mNext;
            tempNode->mNext = NULL;
        }
    }
    delete tempNode;
}

template <class T>
ostream& operator<<(ostream &output, LinkedList<T> obj)
{
    output << obj.mData;
    return output;
}

template <class T>
bool LinkedList<T>::operator==(T right)
{
    return mData == right;
}

template <class T>
bool operator==(T left, LinkedList<T> right)
{
    return left == right.mData;
}

template <class T>
bool LinkedList<T>::operator!=(T right)
{
    return mData != right;
}

template <class T>
bool operator!=(T left, LinkedList<T> right)
{
    return left != right.mData;
}

template <class T>
bool LinkedList<T>::operator>(T right)
{
    return mData > right;
}

template <class T>
bool operator>(T left, LinkedList<T> right)
{
    return left > right.mData;
}

template <class T>
bool LinkedList<T>::operator<(T right)
{
    return mData < right;
}

template <class T>
bool operator<(T left, LinkedList<T> right)
{
    return left < right.mData;
}
#endif

术语.h

#ifndef TERM_H
#define TERM_H
class Term
{
private:
    double mCoefficient;
    double mExponent; 
public:
    Term();
    Term(double coefficient, double exponent);
    ~Term();
    double getCoefficient();
    double getExponent();
    void setCoefficient(double coefficient);
    void setExponent(double exponent);
};
#endif

您的术语类需要一个较小的比较器。以下任一方法都可以:

在术语类作为成员中:

bool operator <(const Term&) const; 

或自由运算符功能:

bool operator <(const Term& left, const Term& right);

为什么?因为LinkedList<T>::insert(T val)调用以下内容:

while(tempNode != NULL && tempNode->mData < data)

tempNode->mDatadata都属于模板扩展的 Term 类型。但是没有operator <(成员函数或自由函数)将两个Term对象与"较小"进行比较。

不确定您要如何对它们进行排序(我可能会先按指数对它们进行排序,然后指数的系数相同)。我把它留给你,但无论如何你都需要操作员。

示例(在 Term 类中作为成员)

bool operator <(const Term& rhs) const
{
    return (mCoefficient < rhs.mCoefficient ||
           (!(rhs.mCoefficient < mCoefficient) == && mExponent < rhs.mExponent));
}

示例 II(自由运算符;不是Term的成员)

bool operator <(const Term& lhs, const Term& rhs)
{
    return (lhs.getCoefficient() < rhs.getCoefficient() ||
           (!(rhs.getCoefficient() < lhs.getCoefficient()) == && 
             lhs.getExponent() < rhs.getExponent()));
}

注意:如果这是好友Term您可以直接访问成员,而不是通过它们的 getter 函数(顺便说一下,应该声明为const,因为它们不会对调用它们的 Term 对象进行任何修改)。

相关文章: