未定义引用`vtable for class

时间:2015-07-07 07:06:20

标签: c++

我从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 

1 个答案:

答案 0 :(得分:3)

只要你的类定义中有一个虚拟关键字,编译器就会静态构建vtable,即使你没有继承它,因为你可以在你的类中看到你没有定义你的goBowling方法,所以编译将会失败。