Проблема наследования C ++ - PullRequest
       5

Проблема наследования C ++

3 голосов
/ 02 октября 2010

Я пытаюсь реализовать левое дерево, используя кучи в качестве базового класса.Ниже приведено содержимое heap.h:

template <class T>

class heap {
public:
    virtual void init(T*) = 0;
    virtual void insert(T*) = 0;
    virtual T delete_min() = 0;
};

Ниже приведено содержимое leftist.cpp:

#include "heap.h"

template <class T>
class leftist_tree : public heap<T> {
private:
    T* root;
public:
    void init(T* a) {}
    void insert(T* a) {}
    T delete_min() {T a; return a;}
};

Я передаю другой класс leftist_node в качестве параметра этому классуиспользуя следующее определение:

leftist_tree<leftist_node> mytree;

Я получаю неразрешенную внешнюю ошибку символа LNK 2001 для функций init, insert и delete_min.Что я делаю неправильно?

Редактировать:

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

try.cpp

#include "stdafx.h"
#include "myclass.h"

int _tmain(int argc, _TCHAR* argv[])
{
    myclass<int> a;
    a.hello(3);
    return 0;
}

myclass.h

template <class T>

class myclass {
public:
    void hello(T);
};

myclass.cpp

#include "myclass.h"
#include <iostream>
using namespace std;

template <class T>
void myclass<T>::hello(T a){
    cout<<a<<endl;
    system("pause");
}

Я получаю похожее сообщение об ошибке:

1> try.obj: ошибка LNK2001: неразрешенный внешний символ "public: void __thiscall myclass :: hello (int)" (? Hello @? $ Myclass @ H @@ QAEXH@Z) 1> c: \ users \ meher anand \ Documents \ visual studio 2010 \ Projects \ try \ Debug \ try.exe: фатальная ошибка LNK1120: 1 неразрешенная внешняя оболочка

Можете ли вы сказать мне, куда я идуне так прямо сейчас?Спасибо

Ответы [ 4 ]

3 голосов
/ 02 октября 2010

Шаблонные функции обрабатываются немного иначе, чем обычные функции.Компилятор на самом деле не компилирует функцию, пока вы не попытаетесь ее использовать.Если единственное место, где вы пытаетесь использовать его, это .cpp, где тело функции не определено, оно предполагает, что оно должно быть скомпилировано где-то еще, и делает ссылку для компоновщика, чтобы заполнить его позже.

В вашемЕсли вы определили тело функций в leftist.cpp, но вы не использовали его там, вы использовали его где-то еще.Если бы вы определили его в файле .h, то определение было бы доступно везде, где вы пытались его использовать, и все было бы хорошо.Если бы вы использовали функции где-то в leftist.cpp, то функции были бы созданы, и компоновщик исправил бы все.

Общее правило - определять тело всех функций шаблона в заголовочных файлах.

3 голосов
/ 02 октября 2010

Шаблон не создан для данного типа. Самый простой способ - удалить .cpp из компиляции и включить его в cpp, где вы используете шаблон.

Другой простой ответ - просто определить весь шаблон в .h.

1 голос
/ 02 октября 2010

Должно работать следующее (протестировано с g ++):

// File: heap.hh --------------------------
template <class T>
class heap {
public:a
    virtual void init(T*) = 0;
    virtual void insert(T*) = 0;
    virtual T delete_min() = 0;
};

// File: leftist_tree.hh ------------------
#include "heap.hh"
template <class T>
class leftist_tree : public heap<T> {
private:
    T* root;
public:
    void init(T* ) {}
    void insert(T* ) {}
    T delete_min() {T a; return a;}
};

// File: leftist_node.hh ------------------
struct leftist_node {
    int value;
};

// File: leftist_main.cpp -----------------
#include "leftist_tree.hh"
#include "leftist_node.hh"

int main() {
    leftist_tree< leftist_node > mytree;
}
1 голос
/ 02 октября 2010

Всякий раз, когда вы видите эту ошибку

ошибка LNK20XX неразрешенный внешний символ

Это означает, что при компоновке компоновщик не может найти определение функции.В вашем случае это ошибка

Надеюсь, это вам поможет.Дайте мне знать, если вам нужна дополнительная помощь

PK

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...