模板函数C ++ Sqlite3 Wrapper

时间:2015-12-15 11:17:55

标签: c++ sqlite templates char-pointer

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

0 个答案:

没有答案