C++合并有序数组程序编译报错:fstream的open函数传string参数无匹配
问题原因分析与解决办法
错误原因
你遇到的编译错误是C++版本兼容性问题导致的:
- C++98标准中,
std::ifstream和std::ofstream的open()方法只支持传入C风格字符串(const char*类型),不支持直接传入std::string类型的参数。 - 你代码中直接给
open()传入了std::string类型的变量s,旧版本编译器不识别这个重载,就会报no matching function for call的错误。
解决方法
- 方案一:兼容所有C++版本的修改方法
把所有调用open()的地方,把传入的字符串调用.c_str()方法转为C风格字符串即可,只需修改两处代码:readSortedArray函数里的in.open(s);改为in.open(s.c_str());main函数里的out.open(s);改为out.open(s.c_str());
- 方案二:启用C11及更高版本标准
如果你使用的编译器支持C11及以上标准(当前主流编译器均支持),可以在编译命令中添加C标准指定参数,比如GCC/Clang编译器加-std=c++11(或更高的-std=c++14/-std=c++17等),C11开始已经新增了接受std::string参数的open()重载,不需要修改代码也能编译通过。
额外优化提示
你当前代码固定了数组长度为20,每次都会读满20个元素,如果输入文件内的有效元素不足20个,未赋值的数组元素会是随机值,会污染合并结果。可以修改读取逻辑,统计实际读取到的有效元素个数,合并的时候只用有效区间的元素即可。
内容的提问来源于stack exchange,提问作者ChunkierLizard
相关产品推荐
相关产品推荐

