C++ 连接2&x2B;字符串到1字符串
当我尝试将字符串对象与其他字符串连接时,我将得到一个我的方法不接受的“basic_string” 我得到了以下错误: 错误:没有用于调用的匹配函数 'Class1::doSomething(标准:uuuCXX11::基本_string)' 我的主要班级: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
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);
}