C++实现vec3类时构造函数初始化列表g++编译报错
问题描述
我正在跟随 Ray Tracing in One Weekend 教程学习,反复核对代码与教程内容完全一致,但仍出现类构造函数未正确赋值的异常错误。
我实现的vec3类代码如下:
class vec3{ public: // Default constructor (zero vector) vec3() : e{0,0,0} {} // Constructor vec3(double x, double y, double z) : e{x, y, z} {} // various functions public: double e[3]; };
使用g++编译时抛出如下错误信息:
./vec3.h:12:27: error: expected member name or ';' after declaration specifiers vec3() : e{0,0,0} {} ^ ./vec3.h:12:19: error: expected '(' vec3() : e{0,0,0} {}
我是C初学者,这是我接触的第二个C项目,想请问该报错是g++编译器配置问题,还是代码中存在未发现的错误?
报错原因
这个报错既不是代码编写错误,也不是g编译器配置损坏,核心原因是编译时默认使用的C标准版本过低:
- 构造函数中使用花括号直接初始化成员数组的写法(即
e{0,0,0}这类形式)是C++11标准才正式引入的语法特性 - 多数版本的g在不附加特殊参数的情况下,会默认使用老旧的C98标准做语法解析,无法识别这种新语法,就会抛出对应的语法解析错误。
解决方法
编译时手动指定使用C11及以上版本的标准即可,在g编译命令中添加对应参数:g++ -std=c++11 你的源码文件名.cpp -o 输出程序名
如果后续运行教程代码时遇到其他新语法的兼容问题,也可以直接指定更高的稳定版本,比如使用-std=c++17参数,适配性更好。
提示:Ray Tracing in One Weekend 全系列的示例代码本身就基于C++11及以上版本编写,不需要为了兼容老标准修改教程给出的代码,直接调整编译参数即可。
内容的提问来源于stack exchange,提问作者Ammar Ahmed
相关产品推荐
相关产品推荐

