Ошибки компоновщика C ++ при вызове конструктора (Beginner :-() - PullRequest
1 голос
/ 21 февраля 2011

Я возвращаюсь к c ++ через 20 лет, но язык, похоже, сильно изменился. Я не могу заставить это бежать. Я чувствую себя студентом.

Это упражнение дерева 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.

Пожалуйста, помогите. Я теряю самооценку.

Ответы [ 2 ]

4 голосов
/ 21 февраля 2011

Когда вы используете шаблоны, вы почти всегда должны объявлять и определять шаблоны в файле заголовка. Вы не можете поместить определения шаблонов функций или функций-членов шаблонов классов в отдельный файл .cpp, потому что компилятору должно быть доступно определение при использовании шаблона.

Дополнительные сведения см. В статье C ++ FAQ Lite, Почему я не могу отделить определение своего класса шаблонов от его объявления и поместить его в файл .cpp?

1 голос
/ 21 февраля 2011

В большинстве компиляторов разделение шаблонов на заголовочные файлы и файлы реализации не поддерживается (по уважительной причине - это кошмар для реализации с точки зрения компилятора). Обычно при работе с шаблонными классами вы либо записываете все это в строку в заголовочном файле (наиболее часто), либо включаете свой файл реализации в конец заголовка (менее распространенный, но полезный для классов со сложными реализациями).

...