您的位置:首页 > Web前端

调用模板类出现 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),小店新开张,我可以直接返现哦。想看看就点下这里,感谢各位看我博客的网游的支持,也欢迎大家对文章的内容批评指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐