C++ 连接2&x2B;字符串到1字符串

C++ 连接2&x2B;字符串到1字符串,c++,mysql,string,C++,Mysql,String,当我尝试将字符串对象与其他字符串连接时,我将得到一个我的方法不接受的“basic_string” 我得到了以下错误: 错误:没有用于调用的匹配函数 'Class1::doSomething(标准:uuuCXX11::基本_string)' 我的主要班级: using namespace std; int main() { string s = "test"; Class1* class1 = new Class1(); class1->doSomething("so

当我尝试将字符串对象与其他字符串连接时,我将得到一个我的方法不接受的“basic_string”

我得到了以下错误:

错误:没有用于调用的匹配函数 'Class1::doSomething(标准:uuuCXX11::基本_string)'

我的主要班级:

using namespace std;
int main() {
    string s = "test";
    Class1* class1 = new Class1();
    class1->doSomething("some text " + s + " too");
}
我的“一班”:

为什么我不能把字符串加在一起?

你可以

该错误与
+
无关

错误是因为您正在将一个
std::string
传递给一个需要
const char*
的函数,而这两件事并不相同

不过,这是可以修复的,因为
std::string
有一个成员函数,可以从其内容中为您提供一个C样式的字符串,正是针对这种情况:

class1->doSomething(("some text " + s + " too").c_str());
另一方面,一个最小的例子是:

std::string str = "hi";
Class1 class1;
class1.doSomething(str);
那么您应该已经知道
+
是不相关的

如果<代码>类1>代码>是您的,您可能会发现允许类接受C++字符串更为地道,只在必要时“MySQL API”“

”:

void doSomething(const std::string& sql) {
    doSomething(sql.c_str());
}

void doSomething(const char* sql) { 
    mysqli_query(connection, sql);
}
(我保留了原来的重载,因为如果您最初有一个C字符串,那么仅为这个函数调用构造
std::string
将是浪费。)


现在您的原始用法已经很好了。

我宁愿将
Class1::doSomething
的签名更改为接受
std::string
,并在方法中使用
sql.c_str()
。还有,我要注意。@Zereges:Jinx!:)@泽雷格斯可能是一个悲观主义者。我会说,
std::string_view
:)@SergeyA:好吧,很公平,这是一个很好的决定。我听说过,但我不是一个C++17er(或C++20,随便什么)“
Class1=new Class1();
”你的意思是
Class1*Class1=new Class1(),对吗?否则,它不会编译为另一个原因。但最好完全放弃这种动态分配…@LightnessRacesinOrbit是的。
void doSomething(const std::string& sql) {
    doSomething(sql.c_str());
}

void doSomething(const char* sql) { 
    mysqli_query(connection, sql);
}