奇怪的链接器错误未定义对 vtable 的引用

Weird linker error undefined reference to vtable

本文关键字:vtable 未定义 引用 链接 错误      更新时间:2023-10-16

我有一个没有虚函数的类,这个类包含另一个类,这是它们的定义:

class StorageManager : public QObject {
    Q_OBJECT
protected:
    class AbstractWrapper {
    public:
        virtual void action1() = 0;
        virtual void action2() = 0;
        virtual void action3() = 0;
        virtual ~AbstractWrapper() {}
    };
    class AbstractStorage {
    public:
        virtual QSharedPointer<AbstractWrapper> getWrapper(QString key) = 0;
        virtual QSharedPointer<AbstractWrapper> newWrapper(QString key) = 0;
        virtual void deleteWrapper(QString key) = 0;
        virtual ~AbstractStorage() {}
    };
    template<typename T>
    class Wrapper {
    public:
        virtual void action1() { /* do stuff */ }
        virtual void action2() { /* do stuff */ }
        virtual void action3() { /* do stuff */ }
        virtual ~Wrapper() {}
    private:
        T * realContent;
    };
    template<typename T>
    class Storage {
    public:
        virtual QSharedPointer<AbstractWrapper> getWrapper(QString key)
        {
            return new Wrapper<T>(storage.value(key));
        }
        virtual QSharedPointer<AbstractWrapper> newWrapper(QString key)
        {
            T * tmp = new T();
            QObject::connect(tmp,         SIGNAL(signal(int)),
                             &dispatcher, SLOT(slot(int)));
            storage.insert(key, tmp);
            return new Wrapper<T>(tmp);
        }
        virtual void deleteWrapper(QString key)
        {
            T * tmp = storage.value(key);
            disconnect(tmp, SIGNAL(signal(int)),
                       &dispatcher, SLOT(slot(int)));
            delete tmp;
            storage.remove(key);
        }
        virtual ~Storage() {}
    private:
        QHash<QString, T *> storage;
    };
private:
    static Storage<ClassA> classAStorage;
    static Storage<ClassB> classBStorage;
    static Storage<ClassC> classCStorage;
    static StorageManager dispatcher;
public:
    static AbstractStorage * getStorage(int classid)
    {
             if(classid == 'A') return &classAStorage;
        else if(classid == 'B') return &classBStorage;
        else if(classid == 'C') return &classCStorage;
        else throw std::exception();
    }
    public void connectDispatcher(QObject * receiver, const char * method)
    {
        connect(&dispatcher, SIGNAL(dispatch_signal(int)), receiver, method);
    }
public slots:
    void slot(int output)
    {
        emit dispatch_signal(output);
    }
signals:
    void dispatch_signal(int);
}

我还有一个包含所有静态启动的.cpp文件。

编译时我没有编译错误。但是一个链接器错误:

undefined reference to `vtable for StorageManager'

此错误标记在类定义行上:

class StorageManager : public QObject {

我知道这种错误与纯虚拟成员未重载有关,但我在我的代码中没有看到此错误......

感谢您的帮助


编辑:

答:该文件不是由 moc 编译的。解决方案:从项目中删除文件,使用"添加新..."、"C++类"添加相同的类。三重检查您是否选择 QObject 作为父类。

这可能是一个与QtCreator相关的错误,这与修订版3af3fe7ad3的QtCreator 3.3.2一起应用。

找到解决方案!

头文件不是由 moc 编译器编译的,而是在.pro文件中。

要解决此问题:从项目中删除头文件和源文件。清理您的项目。生成您的项目。

然后使用QtCreator助手添加您的类:

  • 添加新...
  • C++类
  • 命名类并选择 QObject 作为基类

然后重新生成您的项目,这应该没问题。


这可能是一个与QtCreator相关的错误,这与修订版3af3fe7ad3的QtCreator 3.3.2一起应用。