在为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 **)
”。