私は多くの答えを検索しましたが、私の問題を解決することはできません。私はC++を初めて使っています。以下は私のコードの簡略化された抽出です。C++ undefined vtable例外への参照
TestHeader.h:
#ifndef NAMESPACE_TESTHEADER_H_
#define NAMESPACE_TESTHEADER__H_
namespace Namespace {
class TestHeader {
public:
TestHeader(const std::string& str) : anyString_(str) { }
virtual std::string methodOne(const std::string& param) const;
virtual ~TestHeader() { anyString_.clear(); }
protected:
std::string anyString_;
};
}
#endif //NAMESPACE_TESTHEADER__H_
TestHeader.cpp:
#include "TestHeader.h"
using namespace std;
namespace Namespace {
TestHeader::TestHeader(const std::string& str):anyString_(str) { <do something>; }
std::string TestHeader::methodOne(const std::string& param) const
{
return <A string>;
}
TestHeader::~TestHeader() {
anyString_.clear();
}
}
私は単に私のパッケージ内の他の.cppファイルに次の行を呼び出した何をしたか:
#include "TestHeader.h"
TestHeader testHeader("whatever");
ビルドは投げに失敗した
error: undefined reference to 'vtable for Namespace::TestHeader'
the vtable symbol may be undefined because the class is missing its key function
最も奇妙なことは、次のとおりです。ヘッダーのみで一緒にデストラクタで、私は、ヘッダーと.CPPでの実装でvirtual std::string methodOne(const std::string& str) const;
をコメントアウトする場合は、OR、私は、コンストラクタの後: anyString_(str)
をコメントアウトした場合とanyString_.clear();
、ビルドが成功します。
コンストラクタとデストラクタを2回定義したのはなぜですか?それはコンパイルするべきではありません。あなたがソースを適切にコンパイルしてリンクしていないと思います。 – Curious
コンストラクタとデストラクタの再定義をコンパイルしないと思います。 – user1438832
ヘッダに 'std :: string'を含めないでください。失敗はリンケージ上にあるだけではありません。適切な[mcve]を投稿してください。何も複製していない、ダムダウンしたものではありません。 – StoryTeller