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,但自己编译会导致完全相同的问题。

niklas@emerald:~/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);
}
4

3 回答 3

3

你的程序不正确。所有虚函数都被视为已使用odr-used),因此您需要为所有虚函数提供定义。一旦你解决了这个问题,这个问题应该会消失。

编译器抱怨 vtable 不可用。vtable-s 是一个实现细节,因此不被标准处理,但许多编译器会在定义第一个(非内联)虚函数的翻译单元中生成 vtable。在您的情况下,无论生成 vtable 的标准是什么,您都没有遵守它。

于 2012-06-12T14:54:14.397 回答
3

请参阅我在 GCC wiki 上写的内容,以解释未定义的对 vtable 的 X错误引用。

SO上还有很多关于链接器错误的现有问题,我相信其中一个有一个解释它的答案,例如herehere

于 2012-06-12T14:55:59.013 回答
3

您声明但未定义BaseReader. 您需要在.cpp文件中为此提供定义,以便生成 vtable BaseReader。对CharReader.

于 2012-06-12T14:56:02.797 回答