我从cppfaq 12.15获取代码并尝试编译但在linux中使用gcc版本4.8.4获得错误。
对'vtable for
的未定义引用
我很惊讶,因为我没有任何虚拟方法。我已经研究过以下问题,但无法解决问题。
c++ undefined reference to vtable
Undefined reference to 'vtable for xxx'
代码
#include<iostream>
#include<new>
#include<memory> using namespace std;
class Fred; typedef auto_ptr<Fred> FredPtr;
class Fred {
public:
static FredPtr create() throw(bad_alloc);
static FredPtr create(int i) throw(bad_alloc);
static FredPtr create(const Fred& x) throw(bad_alloc);
virtual void goBowling();
private:
Fred(int i=10);
Fred(const Fred& x);
int i_;
};
FredPtr Fred::create() throw (bad_alloc) { return auto_ptr<Fred>(new Fred()); }
FredPtr Fred::create(int i) throw(bad_alloc) {
return auto_ptr<Fred>(new Fred(i)); }
FredPtr Fred::create(const Fred& x) throw(bad_alloc) {
return auto_ptr<Fred>(new Fred(x)); }
Fred::Fred(int i) {
i_ = i;
cout<<" This is simple constructor"<<endl; }
Fred::Fred(const Fred& x) {
i_ = x.i_;
cout<<" This is copy constrcutor"<<endl; }
void sample() {
FredPtr p(Fred::create(5));
p->goBowling(); }
int main() {
sample();
return 0; }
错误:
/tmp/cc6JnLMO.o: In function `Fred::Fred(int)':
cpp12_15.cpp:(.text+0x204): undefined reference to `vtable for Fred'
/tmp/cc6JnLMO.o: In function `Fred::Fred(Fred const&)':
cpp12_15.cpp:(.text+0x247): undefined reference to `vtable for Fred'
collect2: error: ld returned 1 exit status
答案 0 :(得分:3)
只要你的类定义中有一个虚拟关键字,编译器就会静态构建vtable,即使你没有继承它,因为你可以在你的类中看到你没有定义你的goBowling方法,所以编译将会失败。