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

C++使用getline填充vector读取CSV时出现函数匹配错误求助

解决std::getline编译错误及CSV数据填充vector的问题

首先来看编译错误的问题:no matching function for call to 'getline',这通常是因为编译器找不到匹配的std::getline重载,下面是几个你可以尝试的修复步骤:


1. 显式包含<string>头文件

你的代码里用了std::string和std::getline,虽然<iostream>、<fstream>可能间接包含部分string相关的定义,但C++标准并没有强制要求它们必须包含完整的<string>头文件。添加这个头文件可以确保编译器找到正确的std::getline函数:

#include <string> // 新增这行
#include "fhir/persistence/hdf/HdfStorageAdapter.h"
#include <macrologger.h>
#include <iostream>
#include <fstream>
#include <sstream>

2. 排查命名空间冲突

检查HdfStorageAdapter.h头文件中是否定义了自己的getline函数,或者使用了using namespace std;以外的命名空间,导致编译器混淆了函数名称。如果存在这种情况,可以尝试:

  • 确保所有getline调用都明确使用std::前缀(你已经这么做了,但可以再确认)
  • 暂时注释掉HdfStorageAdapter.h的包含,测试编译是否正常,来排查是否是头文件冲突

额外的逻辑错误修复(避免运行时崩溃)

除了编译错误,你的代码还有一个严重的逻辑问题:初始化的std::vector<row_struct> v是空的,直接使用v[i]访问元素会导致未定义行为(比如崩溃)。正确的做法是每次循环创建一个row_struct实例,然后添加到vector中:

修改后的循环代码示例:

std::vector<row_struct> v;
std::string line;
std::ifstream dataInput(path.c_str());
char delimeter(',');
std::string timestampTemp, millisecondsSinceStartTemp, deviceTemp, typeTemp, valueTemp;
LOG_DEBUG("Reading data dump...");

// 去掉i变量,改用push_back
while (std::getline(dataInput, timestampTemp, delimeter)) {
    std::getline(dataInput, millisecondsSinceStartTemp, delimeter);
    std::getline(dataInput, deviceTemp, delimeter);
    std::getline(dataInput, typeTemp, delimeter);
    std::getline(dataInput, valueTemp);

    // 创建临时对象
    row_struct row;
    row.timestamp = atoi(timestampTemp.substr(1, timestampTemp.size() - 2).c_str());
    row.millisecondsSinceStart = atoi(millisecondsSinceStartTemp.substr(1, millisecondsSinceStartTemp.size() - 2).c_str());
    row.device = atoi(deviceTemp.substr(1, deviceTemp.size() - 2).c_str());
    row.value = atof(valueTemp.substr(1, valueTemp.size() - 2).c_str());
    row.type = *(typeTemp.substr(1, typeTemp.size() - 2).c_str());

    // 添加到vector
    v.push_back(row);

    // 不需要手动clear字符串,下一次getline会覆盖内容
}
return v;

另外,row.type = *(typeTemp.substr(1, typeTemp.size() - 2).c_str());这里要注意,如果typeTemp截取后是空字符串,会导致访问空指针的未定义行为,建议添加一个判断:

std::string typeStr = typeTemp.substr(1, typeTemp.size() - 2);
row.type = typeStr.empty() ? '\0' : typeStr[0];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:17:35