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 不明确错误的主要内容,如果未能解决你的问题,请参考以下文章