【背景】
写一个类成员方法,封装编程中对数据库的更新、插入操作。
我的数据库操作代码中的变量有两个:(1)sql语句;(2)addBindValue的变量,同时变量数量也是不定的,所以我需要使用template来表示这一不定参数
下面先逐条记录一下过程中遇到的问题及解决方案,再附上参考代码。
【问题及解决方案】
- “无法解析外部符号”
描述:我将方法声明在.h头文件,实现在.cpp文件,但是识别不到方法
解决:模板的声明和定义通常要一同放在头文件中
- "未找到匹配的重载函数bind"
描述:我在bind方法中实现对template agrs的遍历,以绑定各个变量到sql,但报错显示我少了bind的重载
解决:在遍历到args最后一个元素时,需要调用bind重载函数,参数会发生变化,具体见下方代码
- “没有与参数列表匹配的函数模板”
描述:在主函数调用时报错,查看了很多博文,说到是实例化模板的问题,搞不懂这个
解决:
我仔细检查了自己的代码,我的形参都以&形式引用变量名,但实参中有常量,所以导致参数不一致。
因为我并不对传入的变量进行改动,所以我将方法形参中的“&”都删去,问题解决。
【代码】
.h文件
#include <qstring.h>
#include <qsqlquery.h>
class PostProcess
{
public:
PostProcess();
~PostProcess();
template<class T, class ...Args>
void bind(QSqlQuery sql_q, T val, Args ...args);
template<class T>
void bind(QSqlQuery sql_q, T val);
template<typename ...Args>
void database_operate(QString s, Args ...args);
};
//模板类的实现和声明需要一同写入到头文件中
template <class T, class ...Args>
void PostProcess::bind(QSqlQuery sql_q, T val, Args... args)
{
sql_q.addBindValue(val);
bind(sql_q, args...);
}
// 当可变参数列表只剩下一个参数时,调用重载版本
template<class T>
void PostProcess::bind(QSqlQuery sql_q, T val) {
sql_q.addBindValue(val);
}
//sql语句向数据库插入/更新数据
template<typename... Args>
void PostProcess::database_operate(QString s, Args... args)
{
QSqlQuery sql_q = QSqlQuery();
sql_q.prepare(s);
bind(sql_q, args...);
sql_q.exec();
}
.cpp
#include "PostProcess.h"
PostProcess::PostProcess()
{
}
PostProcess::~PostProcess()
{
}
【参考博文】
函数模板 | 现代 C++ 模板教程 (mq-b.github.io)