Почему мой файл heap.h выдает ошибку LNK2001? - PullRequest
0 голосов
/ 15 февраля 2020

Я провел некоторый поиск и видел эту ошибку, но во многих случаях она была вызвана отсутствием включения. Файл заголовка также находится под заголовочными файлами в vs2019

Ошибка вызвана в main в Leaf<int> leaf(3);

Вот мой main. cpp

#include "heap.h"
#include <iostream>

using namespace std;

int main()
{
    //Need to complete testing from main
    Heap<int> heap(2);
    Leaf<int> leaf(3);

    //heap.insert(3);
}

Вот соответствующий класс в heap.h

template <typename T> class Leaf : public Node<T> {
private:
    T key;
public:
    Leaf(T value) { key = value; }
    virtual Leaf<T>* toLeaf() { return this; }
    virtual Leaf<T>* insert(T key, Node<T>*& created) {
        Leaf<T>* newLeaf = new Leaf<T>(key);
        created = newLeaf;
        return newLeaf;
    }
};

Ошибка:

Severity    Code    Description Project File    Line    Suppression State
Error   LNK2001 unresolved external symbol "public: virtual class Leaf<int> * __cdecl Node<int>::insert(int,class Node<int> * &)" (?insert@?$Node@H@@UEAAPEAV?$Leaf@H@@HAEAPEAV1@@Z)    2-3-4 Heap  C:\Users\catcal\source\repos\2-3-4 Heap\2-3-4 Heap\main.obj 1   

1 Ответ

0 голосов
/ 15 февраля 2020

Почему мой 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>* &) еще не было определено.

...