如何修复C++代码中的Linker问题



我正在尝试编译这段代码,它告诉我链接器命令失败了,但我不知道为什么。以下提供的文件:

driver.cpp:


#include <iostream>
#include "itemType.h"
#include "pQueueType.cpp" 
using namespace std;
int main()
{
cout<<"nnbegin main()nn";
pQueueType<itemType> pq;
pq.create();

itemType e;
e="fee";
pq.put(e);

e="fie";
pq.put(e);
pq.put(e);

e="foe";
pq.put(e);

e="fum";
pq.put(e);

e="baz";
for(int i=0; i<100; i++)
pq.put(e); // 99

e="quux";
for(int i=0; i<100; i++)
pq.put(e); // 99

e="fie";
for(int i=0; i<500; i++)
pq.put(e); // 499

e="foo";
for(int i=0; i<50; i++)
pq.put(e); //49

e="bar";
pq.put(e); // 500
pq.print();

/*
begin main()

fee     0
fie     501
foe     0
fum     0
baz     99
quux    99
foo     49
bar     0

*/

cout<<"nnnn";

while(!pq.isEmpty())
cout<<pq.deQueue()<<"n***********************n";

/*
fie     501
***********************
quux    99
***********************
baz     99
***********************
foo     49
***********************
fum     0
***********************
foe     0
***********************
fee     0
***********************
bar     0
***********************

end main()
*/
cout<<"nend main()nn";
return 0;
}

itemType.cpp:


#include "itemType.h"
#include <iostream>
using namespace std;
itemType::itemType()
{
payLoad_name="";
payLoad_weight=0;
} // stubbed constructor
itemType::itemType(const itemType &p)
{
payLoad_name = p.payLoad_name;
payLoad_weight = p.payLoad_weight;
} // copy constructor
void itemType::operator =(itemType &i)
{
if(payLoad_name==i.payLoad_name&&!i.payLoad_weight){
payLoad_weight++;
}
else {
payLoad_name=i.payLoad_name;
payLoad_weight=i.payLoad_weight;
}
}
bool itemType::operator ==(itemType &i)
{
return payLoad_name==i.payLoad_name;
}
bool itemType::operator >(itemType &i)
{
if(payLoad_weight==i.payLoad_weight){
return payLoad_name>i.payLoad_name;
}
else {
return payLoad_weight>i.payLoad_weight;
}
}
bool itemType::operator <(itemType &i)
{
if(payLoad_weight==i.payLoad_weight){
return payLoad_name<i.payLoad_name;
}
else {
return payLoad_weight<i.payLoad_weight;
}
}
bool itemType::operator !=(itemType &i)
{
return payLoad_name!=i.payLoad_name;
}
bool itemType::operator >=(itemType &i)
{
if(payLoad_weight==i.payLoad_weight){
return payLoad_name>=i.payLoad_name;
}
else {
return payLoad_weight>=i.payLoad_weight;
}
}
bool itemType::operator <=(itemType &i)
{
if(payLoad_weight==i.payLoad_weight){
return payLoad_name<=i.payLoad_name;
}
else {
return payLoad_weight<=i.payLoad_weight;
}
}
/*
void itemType::operator =(string s) // included only for the programmer's convieniance
{
if(payLoad_name==i.payLoad_name&&!i.payLoad_weight){
payLoad_weight++;
}
else {
payLoad_name=i.payLoad_name;
payLoad_weight=i.payLoad_weight;
}
}
/*  in driver.cpp, the code:
itemType i;
i.payLoad="foo";
would be perfectly legal.  This operator allows it to be simply:        i="foo";
It's entirely optional.
*/
ostream &operator << (ostream &out, const itemType &c) // needed to print the list
{
out << c.payLoad_name;
return out;
}

itemType.h:

#ifndef ITEMTYPE_FLAG
#define ITEMTYPE_FLAG
#include <string>
using namespace std;
struct itemType
{
string payLoad_name;       // your option to name it
int payLoad_weight;           // your option to name it
itemType(); // constructor
itemType(const itemType &); // copy constructor

void operator =(itemType &);
bool operator ==(itemType &);
bool operator >(itemType &);
bool operator <(itemType &);
bool operator !=(itemType &);
bool operator <=(itemType &);
bool operator >=(itemType &);

void operator =(string);
friend ostream &operator << (ostream &, const itemType &);
};
#endif

pQueueType.cpp:

#ifndef LISTTYPE_FLAG
#define LISTTYPE_FLAG
#include <iostream>
#include <cstddef>
using namespace std;
template <class T>
class pQueueType
{
private:
static const int MAX=10;
int top, envVar; // discuss the uses of the environmental variable: envVar
T* myList;
public:
pQueueType()
{
myList=NULL;
} // constructor.
//******************************
~pQueueType()
{
delete[] myList;
} // destructor.
//******************************
void create()
{
myList=new T[MAX];
top=0;
}
//******************************
bool isRoom()
{
return top<MAX;
}
//******************************
bool isEmpty()
{
return !top;
}
//******************************
void put(T &e)
{
if(isRoom() && !isThere(e))
myList[top++]=e;
}
//******************************
T deQueue() 
{
if(top>0)
{
T e;
int i=MAX;
e=myList[i];
myList[i]=myList[-top];
return e;
}
else {
cout<<"Fatal Error; attempt to deQueue empty queue. n"
<<"Check isEmpty()n";
cin.get();
exit(1);
}
}
//******************************
bool isThere(T &e)
{
int j=0;
while(j<top && myList[j]!=e)
j++;
if(j<top)
{
envVar=j;
return true;
}
else return false;
}
//******************************
void remove(T &e)
{
if(isThere(e))
myList[envVar]=myList[--top];
}
//******************************
void print() // for diagnostics only
{
for(int k=0; k<top; k++)
cout<<myList[k]<<'n';
}
};
#endif

makefile:

CFLAGS = -O
CC = g++
list: driver.o itemType.o pQueueType.o
$(CC) $(CFLAGS) -o list driver.o itemType.o pQueueType.o
driver.o: driver.cpp
$(CC) $(CFLAGS) -c driver.cpp
itemType.o: itemType.cpp
$(CC) $(CFLAGS) -c itemType.cpp
pQueueType.o: pQueueType.cpp
$(CC) $(CFLAGS) -c pQueueType.cpp
clean:
rm -f core *.o

控制台:

PriorityQueue % make
g++ -O -c pQueueType.cpp
g++ -O -o list driver.o itemType.o pQueueType.o
Undefined symbols for architecture x86_64:
"itemType::operator=(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from:
_main in driver.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [list] Error 1

我是C++的初学者,我真的不知道发生了什么,所以任何帮助都将不胜感激!

链接器错误告诉您,尽管很迟钝,但它找不到的实现

void itemType::operator =(string s)

而且,毫无疑问,如果您查看itemType.cpp文件,则会注释掉实现!

最新更新