C++模板链表链接器错误
C++ Template Linked List Linker Error
我认为我不正确地使用我的模板,但我无法弄清楚我做错了什么。就像模板链表无法弄清楚它需要使用我的 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->mData
和data
都属于模板扩展的 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
对象进行任何修改)。
- Netbeans 10:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- CMake 错误:链接器命令失败,退出代码为 1 和 cpp.o 文件
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 如何修复 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 使用cmake错误链接boost日志
- 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用):在 Macbook 上
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- clang:错误:链接器命令失败,C++代码中的退出代码为 1(使用 -v 查看调用)
- 静态库中的 g++ 错误链接函数
- 未定义的参考错误链接天然函数Android
- C++编译错误:ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v
- QT Q_PROPERTY错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- OSX MOJAVE -LD:架构X86_64 clang找不到符号:错误:链接器命令失败,出口代码1
- C 错误链接器命令失败了出口代码1(使用-V查看调用)
- LD:架构x86_64 clang找不到符号:错误:链接器命令失败,出口代码1(使用-v to See
- 聚输出错误 - 链接列表
- Xcode链接器错误:链接器命令失败,退出代码为1(使用-v查看调用)
- 尝试构建C DLIB示例无法与数百个未定义的参考错误链接