C++中条件运算符拼接字符串的两种情况差异及解决办法
两个C++字符串拼接函数的错误差异分析与解决方法
先看能正常运行的第一个函数:
string createurl(string protocol, string siteName, string domain, bool www = true) { return protocol + "://" + (www ? "www." : "") + siteName + "." + domain; }
再看触发编译器错误的第二个函数:
string greeting(string name, string gender) { return "Hello " + ((gender == "Male") ? "Mr" : "Miss") + name; }
Error: C2110 '+': cannot add two pointers.
错误差异原因
第一个函数里,protocol是std::string类型,当它和C风格字符串"://"相加时,会调用std::string重载的operator+,返回结果依然是std::string。后续所有拼接操作,都是std::string和C风格字符串/另一个std::string相加,会被正确解析为字符串拼接,所以不会报错。
第二个函数里,"Hello "是C风格字符串(本质是const char*指针),三目运算符返回的"Mr"或"Miss"也是const char*指针。C++不允许直接把两个指针相加——这种操作没有实际意义,编译器无法将其解析为字符串拼接,因此抛出C2110错误。
解决方法
有几种简单方式可以修复第二个函数:
把第一个C风格字符串转为
std::string:string greeting(string name, string gender) { return string("Hello ") + ((gender == "Male") ? "Mr" : "Miss") + name; }这样第一个操作数是
std::string,后续的+都会触发字符串拼接的重载,就能正常工作。使用
std::string的append方法:string greeting(string name, string gender) { string result = "Hello "; result.append((gender == "Male") ? "Mr" : "Miss"); result.append(name); return result; }用字符串流拼接:
#include <sstream> string greeting(string name, string gender) { std::stringstream ss; ss << "Hello " << ((gender == "Male") ? "Mr" : "Miss") << name; return ss.str(); }
内容的提问来源于stack exchange,提问作者night_ZAK
相关产品推荐
相关产品推荐

