我刚开始使用模板。
我想创建一个链表类,它存储Type的地址(可以是一个对象)。这是我项目的布局:
linkedlist.h
node.h
node.cpp
linkedlist.cpp
main.cpp
Node.h
template <class Type> struct Node
{
public:
Node<Type>();
Node<Type>(Type* x = 0, Node* pNext = 0);
Type* data;
Node* next;
};
Node.cpp
#include "node.h"
template<class Type> Node<Type>::Node()
{
next = 0;
data = 0;
}
template<class Type> Node<Type>::Node(Type* item, Node* ptrNext)
{
next = ptrNext;
data = item;
}
linkedlist.h
#include "node.h"
template <class Type> class LinkedList
{
private:
Node<Type>* root;
public:
LinkedList<Type>();
~LinkedList<Type>();
void insert(Type*);
void remove(Type*);
};
linkedlist.cpp
#include "linkedlist.h"
template <class Type> LinkedList<Type>::LinkedList()
{
root = 0;
}
template <class Type> LinkedList<Type>::~LinkedList()
{
Node* p;
while(p = root)
{
root = p->next;
delete p;
}
}
// many more....
在main.cpp中,我有以下内容:
int main()
{
int *ptrA, *ptrB;
int a = 100, b = 10;
ptrA = &a;
ptrB = &b;
LinkedList<int>myList;
myList.insert(ptrA);
return 0;
}
并且编译器抛出了链接器错误:
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall LinkedList<int>::~LinkedList<int>(void)" (??1?$LinkedList@H@@QAE@XZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall LinkedList<int>::insert(int *)" (?insert@?$LinkedList@H@@QAEXPAH@Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall LinkedList<int>::LinkedList<int>(void)" (??0?$LinkedList@H@@QAE@XZ) referenced in function _main
尝试解决方案:
我改为调用 LinkedListmyList()。这可以解决链接器错误,但我将无法调用任何成员函数。
如果我放(),myList.insert(ptrA)会说“错误:表达式必须具有类类型”。
显然这不起作用。
有什么问题?我认为整个实施都有问题....
感谢您的时间。
答案 0 :(得分:4)
将材料从linkedlist.cpp ..移动到linkedlist.h
由于它正在声明一个“制作代码的模板”,因此在您为编译器提供要使用的类型之前,机器代码实际上并不存在。
例如,只要所有模板代码对编译器都可见,只要你去:LinkedList<int>myList
,编译器就会创建一个实体类来生成一个int的链表。在您的情况下,编译器无法看到模板代码,因此无法生成机器代码。
在c ++ 11中你可以说'extern template':http://en.wikipedia.org/wiki/C%2B%2B11#Extern_template
在头文件中,然后在你的linkeList.cpp文件中实现'int'版本..当它尝试使用它时,它将在main.cpp中可用。
这样可以使编译器不必在每个使用模板的.cpp文件中生成机器代码,并使编译速度更快。
它也可以在c ++ 98中完成..但它有点棘手而且不是100%可移植,因为我理解它...更容易在任何地方生成代码。对于gnu gcc:http://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html
,这是一个很好的模糊