簡體   English   中英

無法修復對vtable的未定義引用

[英]can't fix undefined reference to vtable

我搜索了一段時間,發現了很多涉及我所遇到問題的線程/頁面,但是我找不到

  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);
}

您的程序不正確。 所有虛擬函數都被視為已使用odr-used ),因此您需要為其提供所有定義。 解決此問題后,該問題將消失。

編譯器抱怨該vtable不可用。 Vtable-s是實現細節,因此沒有被標准處理,但是許多編譯器會在定義第一個(非內聯)虛擬函數的轉換單元中生成vtable。 就您而言,無論生成vtable的標准是什么,您都沒有遵守它。

請參閱我在GCC Wiki上寫的內容,以解釋針對X錯誤的對vtable的未定義引用

在SO上也有關於該鏈接器錯誤的大量現有問題,我敢肯定其中有一個答案可以解釋它,例如, 在這里在這里

您在BaseReader聲明了但未定義虛擬析構BaseReader 您需要在.cpp文件中為此提供一個定義,以便為BaseReader生成vtable。 CharReader相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM