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のコンストラクタの 1 つを実装するだけ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

で仮想デストラクタを宣言しましたが、定義しませんでしたBaseReader.cppvtable を生成するには、ファイルでこれを定義する必要がありますBaseReader。についても同じですCharReader

于 2012-06-12T14:56:02.797 に答える
3

Xエラーのvtableへの未定義の参照を説明するためにGCC wikiに書いたことを参照してください。

そのリンカエラーについてのSOに関する既存の質問もたくさんあります。そのうちの1つに、それを説明する答えがあると確信しています

于 2012-06-12T14:55:59.013 に答える
3

あなたのプログラムは正しくありません。すべての仮想関数は使用済み ( odr-used ) と見なされるためそれらすべての定義を提供する必要があります。それを修正すると、問題は解決するはずです。

コンパイラは、vtable が利用できないと不平を言っています。Vtable-s は実装の詳細であるため、標準では扱われませんが、多くのコンパイラは、最初の (非インライン) 仮想関数を定義する変換単位で vtable を生成します。あなたの場合、vtableを生成する基準が何であれ、あなたはそれに準拠していません。

于 2012-06-12T14:54:14.397 に答える