Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 奇怪的链接器错误未定义对vtable的引用_C++_Qt - Fatal编程技术网

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

C++ 奇怪的链接器错误未定义对vtable的引用,c++,qt,C++,Qt,我有一个没有虚函数的类,这个类包含另一个类,下面是它们的定义: class StorageManager : public QObject { Q_OBJECT protected: class AbstractWrapper { public: virtual void action1() = 0; virtual void action2() = 0; virtual void action3() = 0;

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

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);

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

class StorageManager : public QObject {
我知道这种错误与未重载的纯虚拟成员有关,但我在代码中没有看到这种错误

谢谢你的帮助


编辑:

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

这可能是一个与QtCreator相关的错误,这与版本3af3fe7ad3中的QtCreator 3.3.2出现在一起。

找到了解决方案

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

要解决此问题,请从项目中删除头文件和源文件。清理你的项目。构建您的项目

然后使用QtCreator assistant添加您的类:

  • 添加新的
  • C++类
  • 命名类并选择QObject作为基类
然后重建您的项目,这应该很好



这可能是一个与QtCreator相关的错误,这在版本3af3fe7ad3中的QtCreator 3.3.2中出现。

在构建项目之前是否运行了qmake?是的,我与QtCreator一起工作(其他Q_对象类工作没有问题)。在发布此问题之前,我进行了全面重建;)标题是否列在
.pro
文件的
标题中?是的,我将尝试删除它,然后编译。重新添加并重新编译。好的,由于一些奇怪的原因,文件不是由MOC编译的。将其从项目中删除,然后重新添加以解决问题。谢谢你的帮助。
class StorageManager : public QObject {