2012-06-12 2 views
0

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

  1. объяснение почему эта ошибка возникает
  2. рабочий раствор для моего конкретного случая

ниже приводится Scanner.h:

class BaseReader { 

    public: 

    virtual ~BaseReader(); 

    virtual const char* read() = 0; 
    virtual long position() = 0; 
    virtual long size() = 0; 
    virtual void seek(long position) = 0; 

}; 

class CharReader : public BaseReader { 

    public: 

    CharReader(const char* source); 
    CharReader(const char* source, long size); 

    ~CharReader(); 

    const char* read(); 
    long position(); 
    long size(); 
    void seek(long position); 

    private: 

    char* _source; 
    long _position; 
    long _size; 

}; 

В Scanner.cpp Я просто реализую один из конструкторов CharReader.

Я использую Code :: Blocks, но скомпилировать его сам по себе приводит к той же самой проблеме.

[email protected]:~/git/hiterator (CPP)$ g++ main.cpp hiterator/Scanner.cpp -o main 
/tmp/cclNNwgl.o: In function `hiterator::CharReader::CharReader(char const*)': 
Scanner.cpp:(.text+0x16): undefined reference to `vtable for hiterator::CharReader' 
collect2: ld gab 1 als Ende-Status zurück 

@qdii:

#include "Scanner.h" 
using namespace hiterator; 

#include <stdlib.h> 
#include <string.h> 

CharReader::CharReader(const char* source) { 
    _size = strlen(source); 
    _source = (char*) malloc(_size + 1); 
    memcpy(_source, source, _size + 1); 
} 
+0

Вы также можете вставить .cpp? вероятно, отсутствующее определение одной из виртуальных базовых функций. – qdii

+0

@qdii См. Мое редактирование. –

+1

ну все чистые виртуальные функции должны иметь определение, большинство из них не делают :) – qdii

ответ

3

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

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

+0

Действительно, вот и все. : o После реализации всех методов в «CharReader» компиляция работает нормально. Благодаря! –

3

Просмотреть, что я написал в GCC wiki, чтобы объяснить ошибки undefined reference to vtable for X.

Есть также множество существующих вопросов о SO об этой ошибке компоновщика, я уверен, что у одного из них есть ответ, который объясняет это, например. here или here

3

Вы объявили, но не определили виртуальный деструктор в BaseReader. Вам необходимо предоставить определение для этого в файле .cpp, чтобы сгенерирована таблица vtable для BaseReader. То же самое для CharReader.

+0

Добавление 'BaseReader :: ~ BaseReader() { }' к файлу * .cpp * не устраняет проблему. –

+0

@NiklasR Ah, * и * для 'CharReader'. Разумеется, vtable создается для каждого класса отдельно. –

+0

Затем он говорит 'undefined reference to read()' (для всех методов). Но он зафиксировал вещь 'vtable', а остальное легко. :) +1 –

 Смежные вопросы

  • Нет связанных вопросов^_^