【问题标题】:cannot pass objects of non-trivially-copyable type ‘const class mysqlpp::String’无法传递非平凡可复制类型“const class mysqlpp::String”的对象
【发布时间】:2014-10-28 01:23:38
【问题描述】:

我需要从数据库 (MariaDB) 中检索一个 INT 并将其放入使用 GTK3 制作的列表中。

当我尝试将变量从 MariaDB 传递到 GTK3 时,编译器会抛出以下错误:

cannot pass objects of non-trivially-copyable type ‘const class mysqlpp::String’ through ‘...’ (这发生在函数void item(string nombre)中,在括号内的行中,在for循环中)

所以,我要感谢任何可以告诉我解决此问题的方法的人。 谢谢你的回答。

代码如下:

void item(string nombre)
{
    Connection con;
    con.connect("", server, user, pass);
    con.select_db(db);

    string consulta = nombre;

    Query pedido = con.query(consulta);
    StoreQueryResult resp = pedido.store();

    Row fila;
    for (i=0; i<resp.num_rows(); i++)
/*THE PROBLEM IS HERE*/    
        {
        gtk_list_store_append(GTK_LIST_STORE(list_store), &list_iterator);
        gtk_list_store_set(GTK_LIST_STORE(list_store), &list_iterator, 0, resp[i][1], 1, resp[i][2], 2, resp[i][1],-1);
        }

    con.disconnect();
}

【问题讨论】:

  • 第 70 行是哪一行?
  • 我知道它在里面,但你真的希望我们从源文件的顶部计数第 70 行吗?习惯上在发生错误的那一行添加注释,这样我们就不必自己去寻找它了。
  • @cdhowie 它在 void item(string nombre) 的括号内 for (i=0; i
  • 70 和 71 是该部分括号内的行
  • 使用 SOF 一段时间后,感觉对它的工作方式更加熟悉了,所以我改了问题,让它更清楚。

标签: c++ mysql variables type-conversion gtk3


【解决方案1】:

您似乎正试图将mysqlpp::String 对象传递给gtk_list_store_set()。你不能这样做,因为它是一个 C 函数并且不理解 C++ 对象。1

相反,在字符串对象上调用c_str(),它会返回一个指向以空字符结尾的字符串的指针。 gtk_list_store_set() 会将指向字符串的值复制到自己的内部结构中,因此不会出现数据所有权问题。

gtk_list_store_set(GTK_LIST_STORE(list_store), &list_iterator,
                   0, resp[i][1].c_str(),
                   1, resp[i][2].c_str(),
                   2, resp[i][1].c_str(),
                   -1);

1 具体来说,您试图在va_arg 结构中传递一个C++ 对象,这就是... 在C 函数原型中所代表的内容。您只能对所谓的 trivially-copyable 对象执行此操作,而 mysqlpp::String 对象不可轻易复制。

【讨论】:

  • 非常感谢,我已经被这个问题困扰了一段时间。我将不得不寻找这个,因为我是一个新手,但现在它工作了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多