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

C++模板函数报expected ',' or '...' before '(' token错误求解

C++代码问题排查与解释

当前代码语法错误原因

  1. 类型声明冲突:你给参数同时加了String和prog_char两个类型标识,C++不允许单个参数声明多个基础类型,编译器无法识别该语法,因此抛出括号前缺少分隔符的报错。
  2. 废弃类型问题:原始注释代码的报错是因为prog_char是老旧版本Arduino平台的专有类型,已在后续版本中被弃用,新版本中不存在该内置类型,因此会报「无类型声明」的错误。
  3. 重载函数同样存在类型冲突问题:第二个重载函数的参数const String prog_char progmem[]同样声明了两个类型,也需要同步修复。

(&str)[N] 含义说明

这是C++的数组引用语法,作用是接收固定长度的数组作为参数:

  • 括号是语法必须项:如果去掉括号写为&str[N],编译器会将其解析为「长度为N的指针数组」,和预期的数组引用语义完全不同。
  • 结合模板参数size_t N使用时,编译器可以自动推导传入数组的实际长度赋值给N,无需开发者手动传入数组长度,减少传参错误。
  • 避免了普通数组参数退化为指针后丢失长度信息的问题。

修复后的代码示例

适配新版本Arduino平台的正确写法如下,将废弃的prog_char替换为标准的const char即可:

template<size_t N>
size_t sendProgmem(WiFiClient client, const char (&str)[N])
{
  return sendProgmem(client, str, N);
}

size_t sendProgmem(WiFiClient client, const char progmem[], size_t size) {
    size_t maxSize=2920; // this seems to be the max that write() will ever actually send
    size_t sent=0;

    while(sent < size) {
      size_t sendSize = (maxSize < (size - sent)) ? maxSize : (size - sent);
      sent += client.write(progmem+sent, sendSize); // write() may send less than you asked it to
    }
    return sent;
}

如果你的字符串存储在Flash的PROGMEM区域,只需要给const char增加PROGMEM修饰符即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:15:03