奇怪的链接器错误未定义对 vtable 的引用
Weird linker error undefined reference to vtable
我有一个没有虚函数的类,这个类包含另一个类,这是它们的定义:
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一起应用。
相关文章:
- 纯虚拟类和错误未定义对 'vtable 的引用
- 对植物的 vtable 的未定义引用?
- 未定义的符号缺少 vtable
- 使用多个命名空间对 vtable 的未定义引用
- 对"车辆的 vtable"的未定义引用 - 面向对象的编程练习
- Qt Quick + CMake + 自定义 QObject 导致对"vtable"的未定义引用
- C++ 未定义对 vtable 异常的引用
- 看起来如此主要的错误.cpp:(.text.startup+0xd6):未定义对"vtable for Counter"的引用?
- 用嵌套类对VTable的未定义引用
- 未定义对 vtable 错误的引用
- 对'vtable for class'的未定义引用
- 奇怪的未定义引用了`vtable
- 构造函数中对"vtable"的未定义引用
- C++ 继承问题:未定义对"vtable"的引用
- 构造函数中对 vtable 的未定义引用
- 在 qt 控制台应用程序中未定义对 'vtable for myObj' 的引用 - 信号和插槽
- 关于vtable符号可能未定义,因为类缺少其键函数
- 访问VTable直接发出未定义的错误
- 对"vtable for "命名空间继承的未定义引用 对"类型信息"的未定义引用
- 对具有继承的 vtable 的未定义引用