使用指针读取文件时getline报"no instance of overloaded function"错误求助
解决getline调用时的"no instance of overloaded function"错误
我来帮你搞定这个问题——你遇到的no instance of overloaded function错误,核心原因是指针的const限定符用错了,导致getline没法往目标内存里写数据。
问题根源分析
你的read函数第二个参数声明为char const * ptr2,这意味着ptr2指向的内存是只读的。但std::ifstream::getline的第一个参数需要的是可修改的char指针(它要把读取到的内容写入到这个指针指向的缓冲区),编译器找不到匹配的重载函数,自然就报错了。
另外还有两个小问题:
- 你的代码里用了
exit(),但没包含<cstdlib>头文件,这会导致隐式声明的警告 - 用
while (!file.eof())的读取逻辑有陷阱,会导致最后一行被重复输出(因为eof()只有在尝试读取到文件末尾后才会被置为true)
修正后的代码
#include<iostream> #include<fstream> #include<cstdlib> // 包含exit()所需的头文件 #include<cstring> // 如果需要清空缓冲区的话可以用memset using namespace std; // 修改第二个参数为可修改的char* void read(const char * const, char *); int main() { char filename[20] = { "sentence.txt" }, data[50] = { '\0' }; read(filename, data); return 0; } void read(const char * const ptr, char * ptr2) { ifstream file; file.open(ptr); if (!file.is_open()) { cout << "File not found " << endl; exit(0); } else { // 用getline的返回值作为循环条件,避免eof陷阱 while (file.getline(ptr2, 49, ' ')) { cout << ptr2 << endl; // 可选:每次读取后清空缓冲区,避免残留数据 memset(ptr2, '\0', 50); } file.close(); } }
关键修正点说明
- 调整指针的const限定:把
read函数的第二个参数从char const *改为char *,解除了对目标缓冲区的只读限制,让getline可以正常写入读取到的内容。 - 补充必要头文件:添加
<cstdlib>让exit()函数的声明合法,避免编译警告。 - 优化读取循环:用
file.getline(...)的返回值判断是否读取成功,这样可以精准捕获读取结束的时机,避免最后一行重复输出的问题。
内容的提问来源于stack exchange,提问作者scypx
相关产品推荐
相关产品推荐

