2012-06-12 48 views
0

我一直在尋找了一會兒,發現的涉及這個問題我已經線程/頁面很多,但我無法找到無法修復未定義引用的vtable

  1. 爲什麼此錯誤時
  2. A工作液爲我的具體情況

以下的的解釋是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有關鏈接錯誤的現有問題的負載,我敢肯定,他們的一個有解釋了它的答案,例如herehere

3

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

+0

將'BaseReader ::〜BaseReader(){ }'添加到* .cpp *文件中並不能解決問題。 –

+0

@NiklasR啊,*和*爲'CharReader'。當然,vtable是爲每個類別單獨生成的。 –

+0

然後它說'未定義的引用read()'(對於所有方法)。但它固定了'vtable'的東西,其餘的很容易。 :) +1 –

相關問題