未定义对vtable的引用

6

我有一个名为afporoills的类,它可以帮助在我们的内存管理模块中查找数据。(不要问为什么取这么奇怪的名字,我也不知道)

class afporoills{
    void** test(int pos);
};
void** afporoills::test(int pos){
    int x=(pos<<3)|1023*x;
    void** ret=(void**)x;
    if((int)ret%16) return this.test(pos+1);
    void* (*fp)(float, uint16__t)=x;
    ret=ret+(*fp)(1.0f, (uint16__t)pos);
    return ret;
}
int test(){
    afporoills afporoills14;
    return ((char*) (uint32_t) ((uint32_t) (void*) afporoills14.test(((((uint32_t)))((char*) (void*))1));

}

我一直遇到以下问题:

[连接器错误] 未定义符号 `afporoills` 的虚表

但是我不知道什么是虚表!!! 我没有使用过它,为什么会出现错误?

请帮助我,因为如果我不能解决这个错误,我将无法继续编写该类。

另外,我需要做什么才能使 test 方法图灵完备?


2
http://en.wikipedia.org/wiki/Virtual_method_table - DumbCoder
@DumbCoder,感谢您提供的链接,但是您可以看到我没有使用虚拟方法!那么为什么会出现这个错误呢?@aix 是的,需要该方法是图灵完备的... - n00b
6
适合混淆大赛的正确候选人。但很遗憾,它无法编译:P - BЈовић
这是一个错误吗? int x=(pos<<3)|1023*x; 在此赋值语句的右侧,x 可能具有什么值? - sarnold
2
一个足够愚蠢的愚人节玩笑和真实的事情无法区分。 - namey
2个回答

18

可能您遇到了这个错误是因为您在 Base 类中声明了一个虚拟方法,但没有定义该方法,即没有提供基类中虚函数的函数体。

试着给它一个虚函数的空函数体,然后尝试编译,也许就可以解决问题。我最近在类似情况下遇到了这个错误,通过提供一个定义成功解决了这个问题。


谢谢你,那图灵完备性问题怎么样? - n00b

4
错误提示表明您没有定义基类的虚函数,编译器找不到此函数在基类的虚方法表中。每个派生类的对象都有这个虚方法表,其中包含指向在派生类中定义的方法的地址。
解决错误的方法是,您可以将此函数定义为纯虚函数,即在基类中没有函数体,例如:
virtual int handle(struct per_thread_traffic_log * pttl)=0;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接