【发布时间】:2019-04-22 13:35:33
【问题描述】:
我正在尝试编译我的代码,编译器显示它无法将 Connection 转换为 Connection* 但在函数参数中我从未将指针指定为参数。
标题声明
我发现了我的问题。对不起各位
QueryResult execute_select(Connection *db, QString query);
来源
QueryResult execute_select(Connection db, QString query)
{
int rc;
char* error_message = 0;
QueryResult rs;
//----------Convert Qstring to char
char* sql = (char*) query.toStdString().c_str();
rc = sqlite3_exec(db.db, sql, &callback, (void*) &rs, &error_message);
#ifdef QT_DEBUG
if(rc != SQLITE_OK){
}
#endif
sqlite3_close(db.db);
return rs;
}
编译器出错的地方:
编辑: 这是get连接方法,不返回指针
Connection get_database_connection(char* d_path)
{
Connection conn;
sqlite3 *db;
//Open db
int rc = sqlite3_open(d_path, &db);
//Check if db is open
if(rc != SQLITE_OK){
conn.status = CONNECTION_FAILED;
return conn;
}
conn.db = db;
conn.path = (char*) db_path.toStdString().c_str();
conn.status = CONNECTION_SUCCESS;
return conn;
}
Connection conn = get_database_connection(converted_path);
//Compiler error
QueryResult rs = execute_select(conn, query_string);
编译器消息:
Data\accounts.cpp:在成员函数“std::list* Accounts::load()”中: Data\accounts.cpp:29:55:错误:无法将参数 '1' 的 'Connection' 转换为 'Connection*' 到 'QueryResult execute_select(Connection *, QString)' QueryResult rs = execute_select(conn, query_string);
我希望代码能够编译,但事实并非如此。
【问题讨论】:
-
get_database_connection(converted_path);返回Connection*指针,而不是Connection。 -
char* sql = (char*) query.toStdString().c_str();是一个陷阱。您将获得指向std::string的数据的指针,该数据由toStdString()返回,但该字符串是一个临时对象,并且在表达式末尾不再存在。当您尝试使用指针时,它不再有效。编辑:更不用说抛弃const,这绝对是个坏主意。 -
你没有使用 Qt 中内置的 sqlite 支持有什么原因吗?
-
execute_select(...)是否在单独的头文件中声明?也许,你那里有一个指针类型参数?因此,我首先将execute_select(...)实现(您在问题中发布的那个)注释掉,看看是否会改变错误。 -
“我从未将指针指定为参数。”也许别人在你不知情的情况下做了。编译器在那里看到指针,因为它在错误消息中。在您可以显示 minimal reproducible example 之前,几乎无话可说。
标签: c++