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。并不是说这对你有帮助。