在为数据库创建C++
包装器的过程中。Sqlite3
下面是两个(一起工作)std::vector
用查询结果填充的函数;在我尝试对它们进行模板化之前,这两者都是成功的。char*[]
对于声明char**
中的参数,我收到编译错误(VS 中的 C2664)Sqlite3
。
我不太了解,C
但从我收集的内容中,作为函数参数传递的数组被重写为指针,在转换后制作char*[]
和char**
等效,尽管结果是右值。但是,这将要求vector
是一个 const 引用,从而违背了用结果填充它的目标。
如何更改它以通过成功的查询正确编译?任何其他建议或更正将不胜感激。提前致谢。
template<class T, class A>
int exec_callback(void *ptr, int argc, char *argv[], char *names[]) {
vector<T, A> *vec = reinterpret_cast<vector<T, A> *>(ptr);
vec->push_back(T(int(argv[0]), string(argv[1]), atoi(argv[2]), atoi(argv[3]),
atoi(argv[4]), atoi(argv[5])));
return 0;
}
template<class T, class A>
void selectAllList(vector<T, A>& vec, sqlite3 *db, const char* statement) {
char *errmsg = NULL;
sqlite3_exec(db, statement, exec_callback, &vec, &errmsg);
if (errmsg) {
printf("error: %s!\n", errmsg);
return;
}
else {
fprintf(stdout, "Operation done successfully\n");
}
list(vec);
}
编辑:
更改char *argv[], char *names[]
为char **argv, char **names
没有效果。抛出相同的错误:“无法将参数 3 从转换int (__cdecl *)(void *,int,char **,char **)
为int (__cdecl *)(void *,int,char **,char **)
”。