如何解决C++函数数组参数默认值声明引发的编译错误
报错根因
你遇到的编译错误核心是两个语法规则冲突:
- C++中函数形参如果写为数组类型
numtag fibo[],会自动退化为指针类型numtag* - 你直接用大括号初始化列表
{{0,primality(0)},{1,primality(1)}}给指针类型的形参设默认值,C++不支持这种隐式转换,所以触发类型转换失败报错。
除此之外你的代码还存在两处其他语法错误:
- primality函数中出现未定义变量
n,该行逻辑是判断输入参数大小,应该改为p - numtag结构体中的
tag是char数组类型,不能直接用字符串指针赋值,需要用字符串拷贝函数复制内容。
修复方案
按以下步骤修改即可:
- 提前定义静态的初始斐波那契数组,将它的地址作为fiboPrime的默认参数
- 修正primality函数的未定义变量问题
- 调整结构体初始化逻辑,用strcpy复制素性判断结果到tag数组中
- 修正primality函数的返回值类型为const char*,匹配字符串字面量的常量属性
修复后完整可编译代码
#include <iostream> #include <cstring> using namespace std; struct numtag { unsigned long num; char tag[60]; }; const char *primality(const unsigned long,unsigned long i=0); // 提前定义静态初始数组 static numtag default_fibo[] = { {0, ""}, {1, ""} }; numtag *fiboPrime(const unsigned long,unsigned long i=0,numtag fibo[]=default_fibo); int main(){ // 初始化默认数组的tag内容 strcpy(default_fibo[0].tag, primality(0)); strcpy(default_fibo[1].tag, primality(1)); return 0; }; const char *primality(const unsigned long p,unsigned long i) { if(p<=1) return "NEITHER PRIME NOR COMPOSITE"; else if(p==2||p==3) return "\tPRIME"; else if(p%2==0||p%3==0) return "\tCOMPOSITE"; else if(p<5) i=5; if(i*i<=p) if(p%i==0||p%(i+2)==0) return "\tCOMPOSITE"; else return primality(p,i+6); else return "\tPRIME"; }; numtag *fiboPrime(unsigned long n,unsigned long i,numtag *fibo){ // 后续业务逻辑可在此实现 return fibo; };
内容的提问来源于stack exchange,提问作者JRBros
相关产品推荐
相关产品推荐

