调试了一上午,搞了半天是这个g++编译器本身的问题,模板类果然是个麻烦的家伙。
g++不支持模板类的分离编译,因此模板的实现最好都些在.h文件中,否则将出现undefined reference to XXXX 的错误。下面是一个出错的例子,解决方法就是将unilinklist.c中的代码移到unilinklist.h中。
//unilinklist.h
#ifndef UNILINKLIST_H_INCLUDED
#define UNILINKLIST_H_INCLUDED
g++不支持模板类的分离编译,因此模板的实现最好都些在.h文件中,否则将出现undefined reference to XXXX 的错误。下面是一个出错的例子,解决方法就是将unilinklist.c中的代码移到unilinklist.h中。
//unilinklist.h
#ifndef UNILINKLIST_H_INCLUDED
#define UNILINKLIST_H_INCLUDED
template <typename T>
class Unilinklist
{
public:
typedef struct Node
{
Node *next ;
T data;
}Node;
Unilinklist();
Unilinklist(Unilinklist<T>& o_link);
Unilinklist(T data, int length);
~Unilinklist();
class Unilinklist
{
public:
typedef struct Node
{
Node *next ;
T data;
}Node;
Unilinklist();
Unilinklist(Unilinklist<T>& o_link);
Unilinklist(T data, int length);
~Unilinklist();
int getlength();
void* gethead();
bool travelover();
void copyself(Node** tothird);
bool isempty();
void add_back(T data);
void del_back();
bool insert(int pos, T data);
void* gethead();
bool travelover();
void copyself(Node** tothird);
bool isempty();
void add_back(T data);
void del_back();
bool insert(int pos, T data);
private:
Node* head ;
Node* prevent;
Node* end;
int count ;
Node* prevent;
Node* end;
int count ;
};
template <typename T>
Unilinklist<T>::Unilinklist()
{
prevent = end = head = new Node;
count = 0;
}
Unilinklist<T>::Unilinklist()
{
prevent = end = head = new Node;
count = 0;
}
template <typename T>
Unilinklist<T>::Unilinklist(T data, int length)
{
count = 0;
prevent = end = head = new Node;
while(length-- > 0)
{
prevent = new Node;
prevent->data = data;
end->next = prevent;
end = prevent;
end->next = NULL;
count++;
}
}
template <typename T>
Unilinklist<T>::Unilinklist(Unilinklist<T>& o_link)
{
count = 0;
prevent = end = head = new Node;
o_link.copyself(&head);
end = prevent = head->next;
while(prevent->next != NULL)
{
prevent = prevent->next;
end = prevent;
count++;
//cout<< count << endl;
}
end->next = NULL;
}
template <typename T>
Unilinklist<T>::~Unilinklist()
{
while (head->next != NULL)
{
del_back();
//cout <<count<<endl;
}
}
template <typename T>
int Unilinklist<T>::getlength()
{
return count;
}
int Unilinklist<T>::getlength()
{
return count;
}
template <typename T>
bool Unilinklist<T>::travelover()
{
std::cout << "********The data is:*******" << std::endl;
prevent = head->next;
while (prevent == NULL)
return false;
do
{
std::cout<<prevent->data<<std::endl;
prevent = prevent->next;
}
while(prevent != NULL);
std::cout << "*******The end************\n"<<std::endl;
return true;
}
{
std::cout<<prevent->data<<std::endl;
prevent = prevent->next;
}
while(prevent != NULL);
std::cout << "*******The end************\n"<<std::endl;
return true;
}
template <typename T>
void* Unilinklist<T>::gethead()
{
return head;
}
template <typename T>
void Unilinklist<T>::copyself(Node** tothird)
{
std::cout<<"Copy constructor is running"<<std::endl;
Node* temp;
Node* tempre;
Node* tempend;
temp = new Node;
tempend = tempre= temp;
prevent = head->next;
while(prevent != NULL)
{
tempre = new Node;
tempre->data = prevent->data;
prevent = prevent->next;
tempend->next = tempre;
tempend = tempre;
tempend->next = NULL;
}
*tothird = temp;
std::cout<<"Copy success"<<std::endl;
}
std::cout<<"Copy success"<<std::endl;
}
template <typename T>
bool Unilinklist<T>::isempty()
{
return (head->next == NULL);
}
template <typename T>
void Unilinklist<T>::add_back(T data)
{
prevent = new Node;
prevent->data = data;
end->next = prevent;
end = prevent;
end->next = NULL;
count++;
}
template <typename T>
void Unilinklist<T>::del_back()
{
prevent = head;
while (prevent->next->next != NULL)
{
prevent = prevent->next;
}
if(prevent->next != NULL)
{
end = prevent;
delete(prevent->next);
end->next = NULL;
count--;
}
// cout<<count<<endl;
}
template <typename T>
bool Unilinklist<T>::insert(int pos, T data)
{
if(pos > count)
{
std::cout<<"The position is wrong" <<std::endl;
return false;
}
prevent = head;
while(--pos != 0)
{
prevent = prevent->next;
}
Node* temp = new Node;
temp->data = data;
temp->next = prevent->next;
prevent->next = temp;
return true;
}
#endif // UNILINKLIST_H_INCLUDED
//test.c
#include <iostream>
#include "unilinklist.h"
int main()
{
std::cout << "Default Constructor:\n" << std::endl;
Unilinklist<int> lk1(325, 6);
lk1.add_back(1);
lk1.add_back(2);
lk1.add_back(8);
lk1.add_back(9);
lk1.add_back(88);
lk1.insert(3, 3233539);
lk1.travelover();
lk1.del_back();
lk1.travelover();
Unilinklist<int>lk2 = lk1;
lk2.travelover();
lk2.del_back();
lk2.travelover();
return 0;
}