C++ 类中的虚拟布尔函数参数不工作

C++ 类中的虚拟布尔函数参数不工作,c++,parameters,virtual-functions,C++,Parameters,Virtual Functions,我在类材质中创建了一个虚拟布尔函数,并制作了一个超级类漫反射,定义了函数散射体 问题出在这个函数的参数中,因为它们给出了一个错误:语法错误:missing',before'&'。我不知道为什么会发生这种情况,因为我在另一个有效的项目中使用了相同的代码 ifndef材料 定义材料 包括ray.h 包括vec3.h 包括可点击列表 包括可点击的 课堂材料{ 公众: 虚拟布尔散射常数光线和r_in,常数命中记录和记录,颜色和衰减,光线和散射常数=0;//问题 //错误C4430假定缺少类型说明符int

我在类材质中创建了一个虚拟布尔函数,并制作了一个超级类漫反射,定义了函数散射体

问题出在这个函数的参数中,因为它们给出了一个错误:语法错误:missing',before'&'。我不知道为什么会发生这种情况,因为我在另一个有效的项目中使用了相同的代码

ifndef材料 定义材料 包括ray.h 包括vec3.h 包括可点击列表 包括可点击的 课堂材料{ 公众: 虚拟布尔散射常数光线和r_in,常数命中记录和记录,颜色和衰减,光线和散射常数=0;//问题 //错误C4430假定缺少类型说明符int。 //错误C2143语法错误:缺少“,”在“&”之前 }; 类别:公共材料{ 公众: 漫射常数颜色&a:albedoa{} 虚拟布尔散射常数光线和r_Èin、常量命中记录和记录、颜色和衰减、光线和散射常数{ vec3散射方向=rec.normal+vec3::随机单位向量; 散射=rayrec.p,散射方向; 衰减=反照率; 返回true; } 公众: 颜色反照率; }; 恩迪夫 雷

ifndef RAY_H 定义射线 包括vec3.h 类射线{ 公众: 射线{} 光线常数点3和原点,常数向量3和方向,双时间=0.0 :origorigin、dirdirection、tmtime {} 点3原点常量{return orig;} vec3方向常数{return dir;} 双时间常数{return tm;} 点3双t常数{ 返回orig+t*dir; } 公众: 第3点原点; vec3-dir; 双tm; }; 恩迪夫 可点击

ifndef可点击列表 定义可命中项 包括ray.h 包括材料 班级材料; 结构命中记录{ 第3点p; vec3正常; 共享材料; }; 类可命中{ 公众: 虚拟布尔hitconst射线&r,命中记录&rec const=0; }; 恩迪夫 可点击列表

ifndef可点击列表 定义可命中列表 包括可点击的 包括 包括 使用std::shared_ptr; 使用std::使_共享; 类可点击列表:公共可点击列表{ 公众: 可点击列表{} hittable_listshared_ptr对象{addobject;} 无效清除{objects.clear;} void addshared_ptr对象{objects.push_backobject;} 虚拟布尔hitconst射线与r、hit_记录与记录常数; 公众: 向量对象; }; 布尔命中表列表::命中常数射线和r、命中记录和记录常数{ bool hit_anything=false; 对于常量自动和对象:对象{ 如果对象->hitr,rec{ hit_anything=true; } } 回击任何东西; } 恩迪夫 vec3.h

布拉格语一次 ifndef VEC3_H 定义向量3_H 包括 包括 包括 包括mathing.h 使用std::sqrt; vec3类{ 公众: vec3:e{0,0,0}{} 向量3双e0,双e1,双e2:e{e0,e1,e2}{} 双x常数{返回e[0];} 双y常量{返回e[1];} 双z常数{返回e[2];} vec3运算符-const{return vec3-e[0],-e[1],-e[2];} 双运算符[]int i const{return e[i];} 双精度运算符[]int i{返回e[i];} vec3和运算符+=常量vec3和v{ e[0]+=v.e[0]; e[1]+=v.e[1]; e[2]+=v.e[2]; 归还*这个; } vec3&运算符*=常数双t{ e[0]*=t; e[1]*=t; e[2]*=t; 归还*这个; } vec3&运算符/=常数双t{ 返回*此*=1/t; } 双倍长度常数{ 返回sqrtlength_的平方; } 双长度平方常数{ 返回e[0]*e[0]+e[1]*e[1]+e[2]*e[2]; } 公众: 双e[3]; 内联静态vec3随机{ 返回vec3random\u-double,random\u-double,random\u-double; } 内联静态vec3随机双最小值,双最大值{ 返回vec3random\u doublemin,max,random\u doublemin,max,random\u doublemin,max; } 内联静态向量3随机单元向量{ 自动a=随机双0,2*pi; 自动z=随机双1,1; 自动r=sqrt1-z*z; 返回vec3r*cosa,r*sina,z; } };
内联std::ostream&operator一个可能的原因可能是您包括material.h中的include hittable.h和hittable.h中的include material.h。一般来说,这不是一个问题,但在这两种情况下都需要小心并提供转发声明。材料h中没有远期声明


怀疑此问题的另一个原因是您混合使用了guards和pragma一次-请修改您的代码,可能还有其他循环依赖性问题。

快速更正,diffuse是material的子类,而不是超级类:-

至于手头的问题,看起来可能存在类型错误,C++将为未知类型假定int。看起来像。您的错误消息应该包含一个行号和列号,这将有助于指出哪种类型未解析。第一个错误之后的所有其他错误通常都可以忽略,因为编译器开始猜测,可能会得到真正的确认 用于说明它在解析中的位置


类型问题是由hittable.h和material.h之间的循环引用引起的。要解决这个问题,您可以从hittable.h中删除include material.h,因为您有向前声明类material

请提供准确的代码和准确的错误消息。对于一个简单的语法错误来说,这是很多代码。被删除的这个问题的版本更清晰,尽管不完整——你已经偏离了太远的方向。你描述的诊断是编译器发布的第一个还是最后一个?您需要查看编译器的第一个诊断。最后是屏幕/窗口底部的错误消息。我猜你在看最后一个。查看错误消息并尝试修复其原因的顺序很重要。当代码中出现大量错误时,编译器会逐渐变得更加混乱,错误消息与代码的相关性也会降低。因此,最后一条错误消息通常无助于识别实际问题。当include material.h从hittable.h中删除时会发生什么情况,@mr anonymous?转发声明就是它所需要的,不是吗?@NeilGatenby,我们需要查看.cpp文件来了解会发生什么。无论如何,正确的编码风格涵盖了include-guard、include-sorting、forward-declarations等策略:重构这段代码应该非常有用。这似乎是可行的,因为它是循环引用,因为我在命中表中对material类进行了正向引用