[英]error: invalid conversion from ‘int (*)(std::list<myclass*>, int, char**, char**)’ to ‘int (*)(void*, int, char**, char**)’
我會盡量簡潔。 好吧,我得到了一個項目,其目標是
因此,在此基礎上,我創建了一個位於DBsqlite文件夾(PATH- / DBsqlite3 / foreign_key.db)中的數據庫foreign_key.db。
注意: emp_info的架構如下:
CREATE TABLE emp_info(
SR_NO INT ,
NAME CHAR(32) NOT NULL,
AGE INT(4) NOT NULL CHECK(AGE > 16),
SEX CHAR (6) NOT NULL,
ADDRESS CHAR(70),
EMPID INT NOT NULL CHECK(EMPID>300) UNIQUE,
CARDID TEXT NOT NULL UNIQUE,
SALARY INT CHECK(SALARY>10000) NOT NULL,
MOBILE_NO INT(16) UNIQUE,
EMAIL_ID TEXT(32) UNIQUE,
BDT INT,
PHOTO BLOB );
emp_info表中的條目如下(我刪除了一些列以使其看起來更好):
SR_NO NAME AGE SEX ADDRESS EMPID CARDID SALARY
1 AAA 35 MALE A1A2A3A4 301 1111AAA 11111
2 BBB 36 FEMALE B1B2B3B4 302 2222BBB 22222
3 CCC 37 FEMALE C1C2C3C4 303 3333CCC 33333
4 DDD 38 MALE D1D2D3D4 304 4444DDD 44444
5 EEE 39 MALE E1E2E3E4 305 5555EEE 55555
6 FFF 40 MALE F1F2F3F4 306 6666FFF 66666
7 GGG 41 MALE G1G2G3G4 307 7777GGG 77777
8 HHH 42 FEMALE H1H2H3H4 308 8888HHH 88888
9 III 43 FEMALE I1I2I3I4 309 9999IIII 99999`
我用C ++編寫了以下程序來實現AIM-(1)和AIM-(2)。 下面的程序還創建一個LIST CONTAINER來顯示每個sqlite查詢的值。
#include <iostream>
#include <list>
#include <string>
#include <sqlite3.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
class Employee{
int SR_NO;
int AGE;
int EMPID;
int CARDID;
int SALARY;
int MOBILE_NO;
int BDT;
char NAME;
char SEX;
char ADDRESS;
};
class sqliteDB{
private:
int rc;
sqlite3 *db;
char *zErrMsg;
const char *sql;
public:
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i;
cout << "Number of args= " << argc << endl;
for(i=0; i<argc; i++)
{
cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << endl;
}
cout << endl;
return 0;
}
bool connectDB()
{
rc = sqlite3_open("/DBsqlite3/foreign_key.db", &db);
if( rc )
{
cerr << "Can't open database: " << sqlite3_errmsg(db) << endl;
sqlite3_close(db);
exit(1);
}
else
{
std::cout<<"\n\nDatabase opened successfully\n\n";
}
return 0;
}
bool allEmp()
{ //NOTE- BELOW IS LINE 99
rc = sqlite3_exec(db, "SELECT * FROM emp_info WHERE AGE>40; ", callback, 0, &zErrMsg);
if( rc!=SQLITE_OK )
{
cerr << "SQL error: " << zErrMsg << endl;
sqlite3_free(zErrMsg);
}
sqlite3_close(db);
}
};
int main()
{
list<sqliteDB> employee_info;
// Read from database from below//
for (int i=0; i<1; i++)
{
sqliteDB object2;
object2.connectDB();
employee_info.push_back(object2);
}
list<sqliteDB>::iterator i;
for (i = employee_info.begin(); i != employee_info.end(); i++)
{
if (! i -> allEmp())
cout<< i->allEmp() << endl;
cout << " size of Object inside List is: " << employee_info.size() << '\n';
}
}
以上結果為:
Database opened successfully
Number of args= 12
SR_NO = 7
NAME = GGG
AGE = 41
SEX = MALE
ADDRESS = G1G2G3G4
EMPID = 307
CARDID = 7777GGG
SALARY = 77777
MOBILE_NO = 9833446677
EMAIL_ID = abi@gmail.com
BDT = 07:08:1947PHOTO = NONE
Number of args= 12
SR_NO = 8
NAME = HHH
AGE = 42
SEX = FEMALE
ADDRESS = H1H2H3H4
EMPID = 308
CARDID = 8888HHH
SALARY = 88888
MOBILE_NO = 9833446688
EMAIL_ID = abj@gmail.com
BDT = 08:09:1947
PHOTO = NONE
Number of args= 12
SR_NO = 9
NAME = III
AGE = 43
SEX = FEMALE
ADDRESS = I1I2I3I4
EMPID = 309
CARDID = 9999IIII
SALARY = 99999
MOBILE_NO = 9833446699
EMAIL_ID = abk@gmail.com
BDT = 09:10:1947
PHOTO = NONE
SQL error: 21
size of Object inside List is: 1
雖然,我能夠看到3個sqlite查詢的結果。 但是在列表中創建的對象僅為1(結果的最后一行中注-)。 我希望它是3個對象
我希望List容器將每個有效記錄(行)作為單獨的列表對象存儲在Employee類中。用戶可以訪問顯示記錄的每個字段/列。
我該如何實現? 非常感謝您的幫助。 如果您通過基於此問題的示例演示如何做到這一點,將不勝感激。
謝謝
更新-使用WhozCraig的建議解決方案,我更改了以下內容:
變更1聲明了另一個列表容器Employee:
list<Employee*> employee_info;
變更2將此列表替換為空*未使用
static int callback(list<Employee*> employee_info2, int argc, char **argv, char **azColName)
Change-3回調函數的主要變化
Employee *obj_emp = new Employee;
int i;
cout << "Number of args= " << argc << endl;
obj_emp->SR_NO=(argv[0] ? argv[0] : "NULL");
obj_emp->NAME=(argv[1] ? argv[1] : "NULL");
obj_emp->AGE=(argv[2] ? argv[2] : "NULL");
obj_emp->SEX=(argv[3] ? argv[3] : "NULL");
obj_emp->ADDRESS=(argv[4] ? argv[4] : "NULL");
obj_emp->EMPID=(argv[5] ? argv[5] : "NULL");
obj_emp->CARDID=(argv[6] ? argv[6] : "NULL");
obj_emp->SALARY=(argv[7] ? argv[7] : "NULL");
obj_emp->MOBILE_NO=(argv[8] ? argv[8] : "NULL");
obj_emp->BDT=(argv[10] ? argv[10] : "NULL");
employee_info2.push_back(obj_emp);
cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << endl;
cout << endl;
return 0;
整個程序
#include <iostream>
#include <list>
#include <string>
#include <sqlite3.h>
#include <stdlib.h>
using namespace std;
class Employee{
public:
string SR_NO;
string AGE;
string EMPID;
string CARDID;
string SALARY;
string MOBILE_NO;
string BDT;
string NAME;
string SEX;
string ADDRESS;
};
class sqliteDB{
private:
int rc;
sqlite3 *db;
char *zErrMsg;
const char *sql;
public:
// list<Employee> employee_info2; //this line vector<Employee> *employee_info2; defines a pointer to a vector
//of type Employee and not a vector of type Employee pointers
list<Employee*> employee_info2;
static int callback(list<Employee*> employee_info2, int argc, char **argv, char **azColName)
{
Employee *obj_emp = new Employee;
int i;
cout << "Number of args= " << argc << endl;
obj_emp->SR_NO=(argv[0] ? argv[0] : "NULL");
obj_emp->NAME=(argv[1] ? argv[1] : "NULL");
obj_emp->AGE=(argv[2] ? argv[2] : "NULL");
obj_emp->SEX=(argv[3] ? argv[3] : "NULL");
obj_emp->ADDRESS=(argv[4] ? argv[4] : "NULL");
obj_emp->EMPID=(argv[5] ? argv[5] : "NULL");
obj_emp->CARDID=(argv[6] ? argv[6] : "NULL");
obj_emp->SALARY=(argv[7] ? argv[7] : "NULL");
obj_emp->MOBILE_NO=(argv[8] ? argv[8] : "NULL");
obj_emp->BDT=(argv[10] ? argv[10] : "NULL");
employee_info2.push_back(obj_emp);
cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << endl;
cout << endl;
return 0;
}
bool connectDB()
{
rc = sqlite3_open("/DBsqlite3/foreign_key.db", &db);
if( rc )
{
cerr << "Can't open database: " << sqlite3_errmsg(db) << endl;
sqlite3_close(db);
exit(1);
}
else
{
std::cout<<"\n\nDatabase opened successfully\n\n";
}
return 0;
}
bool allEmp()
{
sqliteDB object2;
object2.connectDB();
//NOTE- BELOW IS LINE 99
rc = sqlite3_exec(db, "SELECT * FROM emp_info WHERE AGE>40; ", callback, 0, &zErrMsg);
if( rc!=SQLITE_OK )
{
cerr << "SQL error: " << zErrMsg << endl;
sqlite3_free(zErrMsg);
}
sqlite3_close(db);
}
};
int main()
{
sqliteDB object1;
object1.connectDB();
object1.allEmp();
}
編譯錯誤后,我得到的是:
example1.cpp: In member function ‘bool sqliteDB::allEmp()’:
example1.cpp:99:95: error: invalid conversion from ‘int (*)(std::list<Employee*>, int, char**, char**)’ to ‘int (*)(void*, int, char**, char**)’ [-fpermissive]
rc = sqlite3_exec(db, "SELECT * FROM emp_info WHERE AGE>40; ", callback, 0, &zErrMsg);
我接下來該怎么辦? 請幫助
您正在嘗試將函數指針傳遞給錯誤類型的sqlite3_exec
函數。 您需要將回調的簽名改回原來的方式。
static int callback(void *param, int argc, char **argv, char **azColName)
然后,您應該適當調用sqlite3_exec
。 像這樣:
rc = sqlite3_exec(db, "SELECT * FROM emp_info WHERE AGE>40; ", callback, &employee_info2, &zErrMsg);
最后,在回調中,將param
回正確的類型。
std::list<Employee*>& employee_info2 = std::reinterpret_cast<std::list<Employee*>&>(*param);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.