C++模板函数报expected ',' or '...' before '(' token错误求解
C++代码问题排查与解释
当前代码语法错误原因
- 类型声明冲突:你给参数同时加了
String和prog_char两个类型标识,C++不允许单个参数声明多个基础类型,编译器无法识别该语法,因此抛出括号前缺少分隔符的报错。 - 废弃类型问题:原始注释代码的报错是因为
prog_char是老旧版本Arduino平台的专有类型,已在后续版本中被弃用,新版本中不存在该内置类型,因此会报「无类型声明」的错误。 - 重载函数同样存在类型冲突问题:第二个重载函数的参数
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
相关产品推荐
相关产品推荐

