Почему мой heap.h выдает ошибку ссылки?
Вы можете проверить, какая это ошибка ссылки, по определенному номеру ошибки, и в этом случае она это LNK2001
. Это говорит о том, что у вас есть неразрешенный внешний символ.
При попытке вызвать функцию в модуле перевода - файл *.cpp
, который еще не был определен, приведет к сбою компоновщика. Это сгенерирует ошибку LNK2001
, которую вы видите. Он просто не знает, что делать с функцией, которую вы пытаетесь вызвать, просто потому, что она еще не определена.
Если присмотреться к описанию, вы узнаете, что вызывает этот флаг ошибки, который запускается компоновщиком. В нем говорится, что Node<int>::insert(int,class Node<int> * &)
невозможно найти или что для него нет определения, объявленного public: virtual class Leaf<int> *
Причина, по которой вы видите это, заключается в том, что в вашем файле main.cpp
вы делаете вызов обоих конструкторов Heap
и Leaf
. И из вашего файла heap.h
вы также определяете, что Leaf
будет публично наследоваться от Node
. Поэтому, когда он пытается создать Leaf<T>
, он не может этого сделать, потому что он не может полностью построить Node<T>
.
Из кода, который вы показали; вы объявили и определили Leaf<T>::insert(T key, Node<T>*& created)
, но, не видя сброса этого заголовочного файла для других возможных включений, а также объявления и определения вашего шаблона класса Node<T>
, простого способа узнать нет. Однако я подозреваю, что Node<T>::insert(T key, Node<int>* &)
не определяется или не генерируется путем вычитания шаблона, поскольку Node<T>::insert(T key, Node<T>* &)
еще не было определено.