我已经搜索了一段时间,发现了一个很多的线程/页面涉及我遇到的问题,但我找不到
以下是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);
}
答案 0 :(得分:3)
您的计划不正确。所有虚拟函数都被视为使用( odr-used ),因此您需要提供所有这些函数的定义。一旦你解决了这个问题,问题就会消失。
编译器抱怨vtable不可用。 Vtable-s是一个实现细节,因此不受标准处理,但许多编译器将在定义第一个(非内联)虚函数的转换单元中生成vtable。在您的情况下,无论生成vtable的标准是什么,您都不遵守它。
答案 1 :(得分:3)
看看我在GCC维基上写的内容,以解释undefined reference to vtable for X错误。
答案 2 :(得分:3)
您在BaseReader
中声明了但未定义虚拟析构函数。您需要在.cpp
文件中为此提供定义,以便生成BaseReader
的vtable。与CharReader
相同。