单文件程序的未定义虚函数表
Undefined vtable for a single-file program
我编写了以下最小的函子"沙盒"代码:
#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()
提供虚拟体或使其成为抽象函数
相关文章:
- 从python调用openMP共享库时,未定义opnMP函数
- 具有外部"c"和程序集的未定义函数
- 已定义函数时出现 G++ "未定义的引用"错误
- 对显式实例化的模板函数的未定义引用
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 为什么我会收到警告,指出函数已使用但未定义,以及已定义但未使用?
- 2个模板化类的非模板友元函数未定义引用错误
- 使用内联函数 c++ 的未定义引用
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- 仅在 MacOS 上析构函数的未定义符号
- 如果用户尝试从 JS 调用对象的未定义函数C++则回调C++代码
- C++编译并链接到指向未定义函数的指针
- C++:定义函数时出现未定义函数错误
- 奇怪的未定义函数引用,函数调用C++不存在
- 类型为"double"的输入参数的未定义函数
- Android NDK:创建一个未定义函数的库
- c++ Builder调用未定义函数hypot/ceil/floor/fab
- 通过 GDB 设置断点时未定义函数"d::~d"
- 如何像传递未定义函数一样传递未定义方法
- 确定未定义函数的参数类型