单文件程序的未定义虚函数表

Undefined vtable for a single-file program

本文关键字:未定义 函数 程序 文件 单文件      更新时间:2023-10-16

我编写了以下最小的函子"沙盒"代码:

#include<cstdio>
struct Functor {
    virtual void operator() ();
    virtual ~Functor() {}
};
template<class Class, class FPtr>
struct FunctorImpl : Functor {
    FunctorImpl( Class const *_obj, FPtr _fptr ) : obj(_obj), fptr(_fptr) {}
    virtual void operator() () { (obj->*fptr)(); }
    virtual ~FunctorImpl() {}
protected:
    Class const *obj;
    FPtr fptr;
};
template<class Class, class FPtr>
FunctorImpl<Class,FPtr> *make_Functor( Class const *obj, FPtr fptr ) {
    return new FunctorImpl<Class,FPtr>(obj,fptr);
}
struct FOO {
    void bar() const { printf("1n"); }
    void bar2() const { printf("2n"); }
};
int main()
{
    FOO f;
    Functor* f1 = make_Functor( &f, &FOO::bar );
    Functor* f2 = make_Functor( &f, &FOO::bar2 );
    (*f1)();
    (*f2)();
}

然而,当编译时,我得到了错误(与gcc (gcc) 4.8.3 20140624 (Red Hat 4.8.3-1))

/tmp/cc4ayCAU.o: In function `Functor::~Functor()':
functor.cpp:(.text._ZN7FunctorD2Ev[_ZN7FunctorD5Ev]+0x13): undefined reference to `vtable for Functor'
/tmp/cc4ayCAU.o: In function `Functor::Functor()':
functor.cpp:(.text._ZN7FunctorC2Ev[_ZN7FunctorC5Ev]+0xf): undefined reference to `vtable for Functor'
/tmp/cc4ayCAU.o:(.rodata._ZTI11FunctorImplI3FOOMS0_KFvvEE[_ZTI11FunctorImplI3FOOMS0_KFvvEE]+0x10): undefined reference to `typeinfo for Functor'

这怎么可能只有一个文件编译?这个问题的解决办法是什么?

非抽象的虚函数(=0)需要一个函数体,即使它们从未被调用。为Functor::operator()提供虚拟体或使其成为抽象函数