C++ 模板函数C++;Sqlite3包装器
在为C++ 模板函数C++;Sqlite3包装器,c++,sqlite,templates,char-pointer,C++,Sqlite,Templates,Char Pointer,在为Sqlite3数据库创建C++包装的过程中。下面是两个函数,它们(一起工作)用查询结果填充std::vector;在我尝试模板化它们之前,这两个都是成功的。我得到了char*[]到char**的编译错误(VS中的C2664),这是Sqlite3声明中的参数 我对C了解不多,但从我收集的数据来看,作为函数参数传递的数组被重写为指针,使char*[]和char**在转换后等价,尽管结果是右值。然而,这将要求向量成为常量引用,从而无法实现用结果填充它的目标 如何通过成功的查询将其更改为正确编译?如
Sqlite3
数据库创建C++
包装的过程中。下面是两个函数,它们(一起工作)用查询结果填充std::vector
;在我尝试模板化它们之前,这两个都是成功的。我得到了char*[]
到char**
的编译错误(VS中的C2664),这是Sqlite3
声明中的参数
我对C
了解不多,但从我收集的数据来看,作为函数参数传递的数组被重写为指针,使char*[]
和char**
在转换后等价,尽管结果是右值。然而,这将要求向量
成为常量引用,从而无法实现用结果填充它的目标
如何通过成功的查询将其更改为正确编译?如有任何其他建议或更正,将不胜感激。提前谢谢
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);
}
模板
int exec_回调(void*ptr、int argc、char*argv[],char*names[]){
vector*vec=重新解释(ptr);
vec->push_back(T(int(argv[0])、string(argv[1])、atoi(argv[2])、atoi(argv[3]),
atoi(argv[4])、atoi(argv[5]);
返回0;
}
模板
void selectAllList(vector&vec、sqlite3*db、const char*语句){
char*errmsg=NULL;
sqlite3_exec(db、语句、exec_回调、vec和errmsg);
如果(errmsg){
printf(“错误:%s!\n”,errmsg);
返回;
}
否则{
fprintf(stdout,“操作成功完成\n”);
}
名单(vec);
}
编辑:
将
char*argv[],char*names[]
更改为char**argv,char**names
无效。抛出相同的错误:“无法将参数3从int(\uu-cdecl*)(void*,int,char**,char**)
转换为int(\uu-cdecl*)(void*,int,char**,char**)
”.argv的类型与向量有什么关系?@CL。这是sqlite3.c
函数的sqlite3_exec
实现中的第三个参数。写为int(*回调)(void*,int,char**,char**),/*回调函数*/
(第602行)。我相信它垂直地映射到行号,而它的索引水平地移动到下一个值。这与向量无关。无论如何,该错误消息没有意义(类型完全相同)。我可以使用不同的编译器。试试exec\u callback
@CL。我的想法完全正确。exec\u回调不走运
。你一字不差地说出来了吗?请问哪种编译器?Borland C++ +5.1.1。并不是说这对你有帮助。