c++ const mysqlpp::String 不明确错误

Posted

技术标签:

【中文标题】c++ const mysqlpp::String 不明确错误【英文标题】:c++ const mysqlpp::String ambiguous error 【发布时间】:2020-06-11 20:59:20 【问题描述】:

我是 C++ 的新手,刚刚得到 C++ 使用 mysql++.h 查询 sql 数据库

SQL 查询本身有效,我可以打印出结果。

char *token;
Query query = conn.query();
query << "SELECT title, description FROM mydb.mytable LIMIT 2";
StoreQueryResult ares = query.store();

for (size_t i = 0; i < ares.num_rows(); i++) 
    cout << "Title: " << ares[i]["title"] << " - Description: " << ares[i]["description"] << endl;
    const char delim[] = "; \t";

    //Error when I add this line
    //token = strtok( ares[i]["description"] , delim);
    //rest of strtok code which works with normal strings, but not mysqlstring
    ...

关键问题是我试图用该行将描述解析为单词

   token = strtok( ares[i]["description"] , delim);

我得到了错误

error: conversion from ‘const mysqlpp::String’ to ‘char*’ is ambiguous

所以我的理解是 strtok 需要一个 char* 并且 conn 返回一个 const mysqlpp::String,我猜这是有道理的。但是,如何将 mysqlpp::String 与其他需要 char* 的普通函数一起使用?

我正在查看 here 以获取一些提示,但卡住了。

我已经尝试过用..转换之类的方法

ares[i]["description"].c_str();

这导致从“const char*”到“char*”的转换无效

char * c = ares[i]["description"].c_str()

这给出了类似的错误。

所以我在这一点上有点迷茫,如何在其他地方使用 mysqlpp::String,将它与采用 char* 或 std::string 的函数一起使用的最佳方法是什么?

模棱两可的意思是什么?

【问题讨论】:

指针.c_str()返回的内容不应该被修改。但是strtok 实际上是这样做的。您可以使用strdup 获取可修改的副本。 不要使用strtok,而是查找MySQL字符串类型,看看它是否有一些可以使用的方法。 然后strdup 需要释放内存。不管字符串类型如何,最好不要使用strtok,因为它还有其他缺陷,例如依赖静态缓冲区。 mysqlpp::String 定义了多个隐式转换操作,这导致了歧义。但更重要的是,mysqlpp::String 是一个 不可变 类型。它不公开任何允许您更改其数据的功能,仅通过assign()operator= 分配新数据。但是strtok() 想要改变数据。 【参考方案1】:

strtok 将更改您传入的字符串,它会在每个标记之后插入字符串终止字符 0x0。所以你需要一个char*,但c_str返回一个const char*

如果您想使用strtok,您需要获取c_str() 返回的const char* 的副本。可能最简单的方法是使用strdup

char* c = strdup(ares[i]["description"].c_str());
token = strtok(c, delim);
...
free(c);

或者:

std::string s = ares[i]["description"].c_str();
char* c = s.data(); // or &s[0] prior to C++17...
token = strtok(c, delim);

【讨论】:

谢谢,非常有用的解释,都可以正常工作。所以两者本质上都必须以一种或另一种方式复制数据?但是有没有不使用 strtok 的替代方法,可以直接使用 mysqlpp::String (只是考虑性能,因为它会做很多解析)?

以上是关于c++ const mysqlpp::String 不明确错误的主要内容,如果未能解决你的问题,请参考以下文章

C++ const总结

c++ 中的 const 和没有 const 方法?

c++ const

C++中const简介

const 在c及c++中应用

C++杂谈const限定符与const指针