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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:36:20