【问题标题】:C++ Error: Cannot convert 'Object' to 'Object*'C++ 错误:无法将“对象”转换为“对象 *”
【发布时间】: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++


【解决方案1】:

正如我在 cmets 中猜到的,问题出在函数声明中(而您正在查看函数定义/实现)。再次发布此内容,以便您接受答案。

【讨论】:

    【解决方案2】:

    我正在查看 execute_update(Connection db, QString query);宣言。 execute_select(Connection *db, QString query);位于文件的底部。不知何故,我的眼睛看不见。我更改了指针声明。代码编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-29
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      相关资源
      最近更新 更多