对vtable的未定义引用

Dr *_*Deo 5 c++ qt linker-errors vtable

我正在尝试编写一个基本上像indianwebproxy一样工作的Http代理

所以我启动了qtcreator,但是我的一个类无法使用臭名昭着的错误进行编译:undefined reference to vtable for HttpProxyThreadBrowser.我无法弄清楚为什么这样做.我在Stackoverflow上阅读了类似的问题,显然问题是未定义的虚拟方法不纯,但我还没有声明任何虚函数.这是我的课

class HttpProxyThreadBrowser : public QThread
{
public:
    HttpProxyThreadBrowser(QTcpSocket outgoingSocket,QTcpSocket  browserSocket,QObject *parent = 0);
    ~HttpProxyThreadBrowser(){};
    void run();

private:
    QTcpSocket outgoingSocket;
    QTcpSocket browserSocket;

};
Run Code Online (Sandbox Code Playgroud)

我在这里用pastebin定义了这个类,以免给你带来烦恼.不幸的是,我无法找出为什么vtable未定义.请协助.

httpproxythreadbrowser.cpp:5: undefined reference to `vtable for HttpProxyThreadBrowser
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

Sim*_*ter 10

析构函数是隐式的,virtual因为基类有一个虚拟的.

GNU编译器发出vtable以及第一个非内联虚拟方法("密钥方法").由于您的d'tor是在类中定义的,因此它是隐式虚拟的,并且由于没有其他虚拟方法,因此您没有密钥方法.

没有用例,其中具体类只有虚拟内联方法,因为它们只能内联到派生类中.

我将dtor的定义移动到实现文件中.

我不确定你是否也需要在moc这里使用,或者如果QThread没有衍生工具(IIRC你只需要它用于Qt的转换操作符,以及信号/插槽).


小智 7

我也有一个undefined reference to vtable错误,并按照未定义的参考vtable ... Q_OBJECT宏的步骤,建议我运行qmake...它工作!


ale*_*sdm 4

您无法复制QTcpSockets,因此如果您尝试通过副本而不是地址传递它们,可能会导致其他神秘错误。

    HttpProxyThreadBrowser(QTcpSocket * outgoingSocket,QTcpSocket * browserSocket,QObject *parent = 0);

private:
    QTcpSocket* outgoingSocket;
    QTcpSocket* browserSocket;
Run Code Online (Sandbox Code Playgroud)

当您更改头文件时,完全重新编译您的项目可能会有所帮助,因为 qmake 生成的 Makefile 有时无法注意到更改。