调用模板类出现 undefined reference 错误的解决方法
2014-02-17 12:56
441 查看
调试了一上午,搞了半天是这个g++编译器本身的问题,模板类果然是个麻烦的家伙。
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();
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);
private:
Node* head ;
Node* prevent;
Node* end;
int count ;
};
template <typename T>
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;
}
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;
}
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;
}
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;
}
小弟最近自己开了一家淘宝店,专门卖睡衣,男睡衣,女睡衣,情侣睡衣,小孩子的睡衣都有,春夏秋冬的也都有,大家有需要的就来看看:鑫华小镇(http://shop108744405.taobao.com),小店新开张,我可以直接返现哦。想看看就点下这里,感谢各位看我博客的网游的支持,也欢迎大家对文章的内容批评指正。
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();
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);
private:
Node* head ;
Node* prevent;
Node* end;
int count ;
};
template <typename T>
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;
}
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;
}
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;
}
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;
}
小弟最近自己开了一家淘宝店,专门卖睡衣,男睡衣,女睡衣,情侣睡衣,小孩子的睡衣都有,春夏秋冬的也都有,大家有需要的就来看看:鑫华小镇(http://shop108744405.taobao.com),小店新开张,我可以直接返现哦。想看看就点下这里,感谢各位看我博客的网游的支持,也欢迎大家对文章的内容批评指正。
相关文章推荐
- 调用模板类出现 undefined reference 错误的解决方法
- 编译3.10内核 出现错误 “undefined reference to...." 解决方法
- 编译WU FTPD出现"undefined reference to crypt"错误解决方法
- PHP 5.3.10 编译安装时出现 undefined reference to `libiconv' 错误的解决方法
- 编译3.10内核 出现错误 “undefined reference to...." 解决方法
- PHP 编译安装时出现 undefined reference to `libiconv' 错误的解决方法
- GCC编译uboot出现(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'错误的解决的方法
- 编译出现"undefined reference to `GTK_WIDGET_REALIZED',`GTK_WIDGET_VISIBLE' "相关错误的解决方法
- C++中Boost使用出现错误undefined reference to `boost::system::generic_category()'解决方法
- 出现undefined reference to `forkpty' 错误解决方法
- QT for linux 的错误 undefined reference to 'FcFreeTypeQueryFace' 的解决方法
- Android camera调用出现错误解决方法
- undefined reference to `pthread_create'错误通过makefie的解决方法
- 开发新浪微博应用出现以下问题Fatal error:Call to undefined function curl_init() in错误的解决方法
- linux 链接库文件出现“undefined reference to" 问题的解决方法
- iOS 中调用类方法出现函数不识别错误的解决方法
- 解决qt程序的链接阶段出现 undefined reference 错误
- android 代码混淆后出现:TypeReference constructed without actual type information这个错误的解决方法
- 个人写前端页面出现jquery is undefined 错误的解决方法(非万能)
- c++ std::sort函数调用经常出现的invalidate operator<错误原因以及解决方法