前面发过贴了,这次说得更具体点:
开发环境:XP+VS2008+QT4.3.7
sqlite3 数据库的操作,项目中因为想要将数据库加密,所以在Qsqldatabase类中自己加了一个函数sqlite3handle(),但是由于基类中是返回的Qvariant 类型,所以sqlite3handle()也返回Qvariant 类型, 转换前的实际类型为sqlite3 *,
在QT的源码的qsql_sqlite.cpp文件中已经通过以下语句将sqlite3 *类型加入到了QVariant中:
#include <sqlite3.h>
Q_DECLARE_METATYPE(sqlite3*)
Q_DECLARE_METATYPE(sqlite3_stmt*)
但后面的编译还是报错:
具体的代码如下:
sqlite3 *sqlDb = NULL;
QVariant vaTemp = m_db.sqlite3handle(); //m_db 为QSqlDatabase类型的私有成员,已经初始化sqlite3连接
sqlDb = vaTemp.value<sqlite3 *>(); //此处总是报错
错误提示如下:
1>d:\qt\4.7.3\include\qtcore\../../src/corelib/kernel/qmetatype.h(169) : error C2039: “qt_metatype_id”: 不是“QMetaTypeId<T>”的成员
1> with
1> [
1> T=sqlite3 *
1> ]
1> d:\qt\4.7.3\include\qtcore\../../src/corelib/kernel/qmetatype.h(169): 编译类 模板 成员函数“int QMetaTypeId2<T>::qt_metatype_id(void)”时
1> with
1> [
1> T=sqlite3 *
1> ]
1> d:\qt\4.7.3\include\qtcore\../../src/corelib/kernel/qmetatype.h(230): 参见对正在编译的类 模板 实例化“QMetaTypeId2<T>”的引用
1> with
1> [
1> T=sqlite3 *
1> ]
1> d:\qt\4.7.3\include\qtcore\../../src/corelib/kernel/qvariant.h(579): 参见对正在编译的函数 模板 实例化“int qMetaTypeId<T>(T *)”的引用
1> with
1> [
1> T=sqlite3 *
1> ]
1> d:\qt\4.7.3\include\qtcore\../../src/corelib/kernel/qvariant.h(599): 参见对正在编译的函数 模板 实例化“T qvariant_cast<T>(const QVariant &)”的引用
1> with
1> [
1> T=sqlite3 *
1> ]
1> d:\qt\4.7.3\include\qtcore\../../src/corelib/kernel/qvariant.h(336): 参见对正在编译的函数 模板 实例化“T qVariantValue<T>(const QVariant &)”的引用
1> with
1> [
1> T=sqlite3 *
1> ]
1> .\Source\DataStore\cdbmanager.cpp(175): 参见对正在编译的函数 模板 实例化“T QVariant::value<sqlite3*>(void) const”的引用
1> with
1> [
1> T=sqlite3 *
1> ]
------解决方案--------------------
- C/C++ code
QVariant vaTemp;vaTemp.setValue(m_db.sqlite3handle());