我正在尝试编译这段代码,它告诉我链接器命令失败了,但我不知道为什么。以下提供的文件:
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
文件,则会注释掉实现!