数据结构查找时的运算符重载问题

时间:2022-09-10 17:35:10
这是我在做数据结构时照着书写的代码,只写了一部分,但是这个运算符重载的问题一直没解决,没法往下做了,请各位帮帮忙!
我用的是Eclipse + MinGw 的gcc编译器,编译器报错是这样的:
src\test.o: In function `main':
I:\Eclipse for CPP\查找算法比较\Debug/../src/test.cpp:18: undefined reference to `operator>>(std::istream&, DataList<int, int>&)'
I:\Eclipse for CPP\查找算法比较\Debug/../src/test.cpp:19: undefined reference to `operator<<(std::ostream&, DataList<int, int>&)'
I:\Eclipse for CPP\查找算法比较\Debug/../src/test.cpp:22: undefined reference to `SearchList<int, int>::seqSearch(int) const'
src\test.o:test.cpp:(.rdata$_ZTV10SearchListIiiE[vtable for SearchList<int, int>]+0x1c): undefined reference to `SearchList<int, int>::seqSearch(int) const'
src\test.o:test.cpp:(.rdata$_ZTV10SearchListIiiE[vtable for SearchList<int, int>]+0x20): undefined reference to `DataList<int, int>::insert(int&)'
src\test.o:test.cpp:(.rdata$_ZTV10SearchListIiiE[vtable for SearchList<int, int>]+0x24): undefined reference to `DataList<int, int>::remove(int, int&)'
src\test.o:test.cpp:(.rdata$_ZTV8DataListIiiE[vtable for DataList<int, int>]+0x1c): undefined reference to `DataList<int, int>::seqSearch(int) const'
src\test.o:test.cpp:(.rdata$_ZTV8DataListIiiE[vtable for DataList<int, int>]+0x20): undefined reference to `DataList<int, int>::insert(int&)'
src\test.o:test.cpp:(.rdata$_ZTV8DataListIiiE[vtable for DataList<int, int>]+0x24): undefined reference to `DataList<int, int>::remove(int, int&)'
collect2: ld returned 1 exit status
Build error occurred, build is stopped

一下是源代码,可能有点长,但是问题应该是在运算符重载那里(我把报错的地方和重载的代码  加粗 了):
/*
 * DataList.h
 *
 *  Created on: 2011-11-30
 *      Author: 
 */

#ifndef DATALIST_H_
#define DATALIST_H_

#include <iostream>
#include <cassert>
//#include <istream>
//#include <ostream>
using namespace std;

const int defaultLength = 100;

template<class E, class K>
class DataList;

template<class E, class K>
class DataNode {
private:
K key;

public:
DataNode<E, K>(const K x) :
key(x) {
}
DataNode<E, K>() :
key(NULL) {
}
friend class DataList<E, K> ;
K getKey() const {
return key;
}
void setKey(K k) {
key = k;
}
};

template<class E, class K>
class DataList {
protected:
DataNode<E, K>* element;
int arrayLength;
int currentLength;

public:
DataList(int length) :
arrayLength(length), currentLength(0) {
element = new DataNode<E, K> [length];
assert(element != NULL);
}
DataList() :
arrayLength(defaultLength), currentLength(0) {
element = new DataNode<E, K> [defaultLength];
assert(element != NULL);
}
DataList(DataList<E, K>& R);
virtual ~DataList() {
delete[] element;
}
virtual int getLength() {
return currentLength;
}

virtual K getKey(int i) const {
assert(i > 0 || i <= currentLength);
return element[i - 1].key;
}

virtual void setKey(K x, int i) {
assert(i > 0 || i <= currentLength);
element[i - 1].key = x;
}

virtual int seqSearch(const K x) const;
virtual bool insert(E& item);
virtual bool remove(const K x, E& item);
friend ostream& operator <<(ostream& out, DataList<E, K>& outList);
friend istream& operator >>(istream& in, DataList<E, K>& inList);

};

#endif /* DATALIST_H_ */


/*
 * SearchList.cpp
 *
 *  Created on: 2011-11-30
 *      Author: 
 */

#include "SearchList.h"
#include "DataList.h"

template <class E, class K>
bool DataList<E, K>::insert(E& e) {
if (currentLength  == arrayLength) {
return false;
}
element[currentLength] = e;
currentLength++;
return true;
}

template <class E, class K>
bool DataList<E, K>::remove(const K k, E& e) {
if (currentLength == 0) {
return false;
}
int i;
for (i = 0; i < currentLength && element[i].key != k; i++) {
if (i == currentLength) {
return false;
}
}
e = element[i];
element[i] = element[currentLength - 1];
currentLength--;
return true;
}

template <class E, class K>
int DataList<E, K>::seqSearch(const K k) const {
element[currentLength].key = k;
int i = 0;
while (element[i].key != k) {
i++;
}
return i + 1;
}

template <class E, class K>
ostream& operator << (ostream& out, DataList<E, K>& outList) {
out << "Array Contents:\n";
for (int i = 0; i <= outList.currentLength; i++) {
out << outList.element[i - 1] << " ";
}
out << endl;
out << "Array Current Length : " << outList.currentLength << endl;
return out;
}

template <class E, class K>
istream& operator >> (istream& in, DataList<E, K>& inList) {
cout << "Enter Array Current Length : ";
in >> inList.currentLength;
cout << "Enter Array Elements : \n";
for (int i = 1; i <= inList.currentLength; i++) {
cout << "Element" << i << " : ";
in >> inList.element[i - 1];
}
return in;
}

/*
 * SearchList.h
 *
 *  Created on: 2011-11-30
 *      Author: 
 */

#ifndef SEARCHLIST_H_
#define SEARCHLIST_H_

#include "DataList.h"

template <class E, class K>
class SearchList : public DataList<E, K> {
public:
SearchList(int length = defaultLength): DataList<E, K>(length) {}
int seqSearch(const K x) const;
};


#endif /* SEARCHLIST_H_ */

/*
 * test.cpp
 *
 *  Created on: 2011-11-30
 *      Author: 
 */

#include "SearchList.h"
#include <iostream>
using namespace std;

const int length = 10;

int main() {
SearchList<int, int> list(length);
int target;
int location;
cin >> list;
cout << list;
cout << "Search for a integer : ";
cin >> target;
if ((location == list.seqSearch(target)) != list.getLength()) {
cout << "Found at index " << location << endl;
} else {
cout << "Not Found!" << endl;
}
}

4 个解决方案

#1


重载的<<的定义放在头文件里试试?

#2


模板的东东都的放.h里吧
否则编译的时候编译器看不到模板实现代码怎么给你模板特化啊

#3


还是有问题,现在编译器提示cannot convert 'DataNode<int, int>' to 'int' in assignment错误
就是像   e = element[i] 这样的报错

#4


你的outList.element[i - 1] 是个DataNode<int, int>类型
你得重载这个类型的 << 操作符

#1


重载的<<的定义放在头文件里试试?

#2


模板的东东都的放.h里吧
否则编译的时候编译器看不到模板实现代码怎么给你模板特化啊

#3


还是有问题,现在编译器提示cannot convert 'DataNode<int, int>' to 'int' in assignment错误
就是像   e = element[i] 这样的报错

#4


你的outList.element[i - 1] 是个DataNode<int, int>类型
你得重载这个类型的 << 操作符