20年后我回到了c ++,但语言似乎已经发展了很多。我无法让它运行。我觉得自己像个学生。
这是一个AVL树练习。 avl代码刚刚下载(不是我的)。
// AVL.H
#include <iostream>
template <class Comparable>
class AvlTree
{
public:
explicit AvlTree( const Comparable & notFound );
AvlTree( const AvlTree & rhs );
~AvlTree( );
// other functions ...
const AvlTree & operator=( const AvlTree & rhs );
private:
AvlNode<Comparable> *root;
const Comparable ITEM_NOT_FOUND;
....etc
};
AVL.CPP
#include "avl.h" // and other system includes
template <class Comparable>
AvlTree<Comparable>::AvlTree( const Comparable & notFound ) :
ITEM_NOT_FOUND( notFound ), root( NULL )
{
}
/**
* Copy constructor.
*/
template <class Comparable>
AvlTree<Comparable>::AvlTree( const AvlTree<Comparable> & rhs ) :
ITEM_NOT_FOUND( rhs.ITEM_NOT_FOUND ), root( NULL )
{
*this = rhs;
}
/**
* Destructor for the tree.
*/
template <class Comparable>
AvlTree<Comparable>::~AvlTree( )
{
makeEmpty( );
}
.... other functions like insert, remove, makeEmpty etc
致电程序(我的)
#include <iostream> ...other includes
#include "avl.h"
class Student
{
int id;
string fname, lname, level;
public:
Student::Student(int idx, string fnamex, string lnamex, string levelx) {
id=idx;
...etc
}
Student::Student(const Student & rhs) {
id = rhs.id;
... etc
}
bool operator< (const Student & rhs ) const
{ return id < rhs.id; }
bool operator== (const Student & rhs ) const
{ return id == rhs.id; }
Student operator= ( const Student & rhs ) {
id = rhs.id;
...etc
}
};
int main()
{
Student notFound(-1,"","","");
AvlTree<Student> myTree(notFound);
system("PAUSE");
return 0;
}
当我在Visual Studio 2008中构建时,我收到以下错误。
Error 1 error LNK2019: unresolved external symbol
"public: __thiscall AvlTree<class Student>::~AvlTree<class Student>(void)" (??1?$AvlTree@VStudent@@@@QAE@XZ) referenced in function _main main.obj AVLTree
Error 2 error LNK2019: unresolved external symbol
"public: __thiscall AvlTree<class Student>::AvlTree<class Student>(class Student const &)" (??0?$AvlTree@VStudent@@@@QAE@ABVStudent@@@Z) referenced in function _main main.obj AVLTree
Error 3 fatal error LNK1120: 2 unresolved externals .....
看起来它说没有定义析构函数和复制构造函数。但我可以看到在AVL.CPP中定义了ARE。
请帮忙。我失去了自尊心。
答案 0 :(得分:4)
使用模板时,几乎总是必须在头文件中声明并定义模板。您不能将函数模板或类模板成员函数的定义放入单独的.cpp文件中,因为编译器需要在使用模板时使用该定义。
有关详细信息,请参阅C ++ FAQ Lite文章Why can't I separate the definition of my templates class from its declaration and put it inside a .cpp file?
答案 1 :(得分:1)
在大多数编译器中,不支持将模板分成头文件和实现文件(出于好的理由 - 从编译器的角度来看这是一个噩梦)。通常在处理模板类时,您可以在头文件中将其全部内联写入(最常见),或者在头文件的末尾包含实现文件(不太常见,但对于具有复杂实现的类很有用)。