无法修复未定义的引用到vtable

时间:2012-06-12 14:51:24

标签: c++ virtual vtable undefined-reference

我已经搜索了一段时间,发现了一个很多的线程/页面涉及我遇到的问题,但我找不到

  1. 解释 发生此错误的原因
  2. 针对我的具体案例的工作解决方案
  3. 以下是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);
    }
    

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

看看我在GCC维基上写的内容,以解释undefined reference to vtable for X错误。

关于链接器错误,还有很多关于SO的现有问题,我确定一个有一个解释它的答案,例如: herehere

答案 2 :(得分:3)

您在BaseReader中声明了但未定义虚拟析构函数。您需要在.cpp文件中为此提供定义,以便生成BaseReader的vtable。与CharReader相同。