C++字符串拼接后传参报错:无匹配的Class1::doSomething函数
解决std::__cxx11::basic_string与const char*的函数参数匹配问题
这个问题我遇到过很多次,本质是C++字符串类型不匹配导致的函数重载匹配失败,我来给你拆解一下原因和解决办法:
问题根源
你在代码里做的字符串拼接 "some text " + s + " too",其中s是std::string对象,和字符串字面量(const char[])相加后,最终得到的是一个临时的std::__cxx11::basic_string<char>(也就是std::string的具体实现类型)对象。而你的Class1::doSomething函数只接受const char*类型的参数,C++编译器不会自动把std::string隐式转换为const char*(因为这需要调用std::string的成员方法c_str(),属于显式操作),所以找不到匹配的函数,就抛出了no matching function for call错误。
两种可行的解决办法
办法1:显式调用c_str()转换类型
直接对拼接后的临时std::string对象调用c_str()方法,把它转换成const char*类型,注意要给整个拼接表达式加括号(因为成员运算符.的优先级高于+):
using namespace std; int main() { string s = "test"; Class1* class1 = new Class1(); // 给拼接表达式加括号后调用c_str() class1->doSomething(("some text " + s + " too").c_str()); }
办法2:修改doSomething函数的参数类型
更推荐这种C++风格的写法,把函数参数改成const std::string&(const引用避免拷贝,效率更高),在函数内部需要const char*的地方再调用c_str()传给mysqli_query:
using namespace std; class Class1 { public: // 修改参数为const std::string& void doSomething(const string& sql) { // 内部调用c_str()转成const char*给mysqli_query mysqli_query(connect, sql.c_str()); } };
这样调用的时候就不需要额外转换,直接传拼接后的字符串即可,代码更简洁也更安全(避免了空指针风险)。
内容的提问来源于stack exchange,提问作者mkkagain
相关产品推荐
相关产品推荐

