C++ - 未定义对 `vtable` 的引用

6

我在想为什么会出现这个错误:

undefined reference to `vtable for BaseRenderer'

我尝试搜索,但似乎无法解决。我已经尝试删除虚函数、移除构造函数等方法。

我的BaseRenderer.h文件如下:

class BaseRenderer : public Renderer
{
 Q_OBJECT

    public:
        BaseRenderer();
        BaseRenderer(QWidget *parent);
        void paintGL();

        virtual ~BaseRenderer();

 public slots:
  void loadDialog();

 signals:

    protected:
        Mesh loadMesh(string fileName);

    private:

        OBJParser objParser;
        Mesh baseTerrain;

};

我的BaseRenderer.cpp

BaseRenderer::BaseRenderer()              <------ Error leads me here
{
}

BaseRenderer::BaseRenderer(QWidget *parent) : Renderer(parent)
{

}

BaseRenderer::~BaseRenderer()
{
    //dtor
}

我该如何解决这个问题?我听说可能是编译器的问题...感谢您的帮助 :)

编译器传递了哪些参数? - sashang
@John - 这是一个 Qt 宏,这意味着这个源文件必须通过一个单独的 Qt 工具(moc.exe)运行,以生成一堆用于 Qt 特定行为(如槽和信号)的代码。 - wkl
@birryree:啊,我对Qt一无所知,所以我会退出这个。 - John Dibling
或者,如果您使用qmake,它会为您在makefile中生成moc命令。 - paxdiablo
请检查您的头文件是否在.pro文件的HEADERS部分中列出。 - Frank Osterfeld
5个回答

9

由于Q_OBJECT在父类Renderer中已经存在,因此您不需要在BaseRenderer中也包含它。只需删除Q_OBJECT即可使其正常工作 :)


它对我有效。你能详细解释一下为什么删除Q_OBJECT可以解决这个问题吗?我从QWidget中子类化了一个东西。 - swdev
如果您在子类中添加插槽,这是行不通的。请参见例如 https://github.com/telegramdesktop/tdesktop/issues/5723#issuecomment-466628042 - Eugene Gr. Philippov
此外,一些文档(在网络上搜索)建议Q_OBJECT应始终存在于QObject的直接或间接子类中。 - Eugene Gr. Philippov

2
在C++ FAQ Lite中查看“虚拟表是未解决的外部问题”的含义

1

我认为这个极不友好的信息实际上是在抱怨你没有为BaseRenderer类中的其他函数提供定义,因为你的baseRenderer.cpp文件似乎只有构造函数和析构函数。


1

请确保您实现了所有声明的方法,特别是槽函数。然后检查您的头文件是否在.pro文件的HEADERS部分中列出,然后运行qmake。


1

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