You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用指针读取文件时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();
    }
}

关键修正点说明

  1. 调整指针的const限定:把read函数的第二个参数从char const *改为char *,解除了对目标缓冲区的只读限制,让getline可以正常写入读取到的内容。
  2. 补充必要头文件:添加<cstdlib>让exit()函数的声明合法,避免编译警告。
  3. 优化读取循环:用file.getline(...)的返回值判断是否读取成功,这样可以精准捕获读取结束的时机,避免最后一行重复输出的问题。

内容的提问来源于stack exchange,提问作者scypx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:53:12