调用构造函数时C ++链接器错误(初学者:-()

时间:2011-02-21 19:04:35

标签: c++ visual-studio-2008 linker-errors

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。

请帮忙。我失去了自尊心。

2 个答案:

答案 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)

在大多数编译器中,不支持将模板分成头文件和实现文件(出于好的理由 - 从编译器的角度来看这是一个噩梦)。通常在处理模板类时,您可以在头文件中将其全部内联写入(最常见),或者在头文件的末尾包含实现文件(不太常见,但对于具有复杂实现的类很有用)。