You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

VS2017编译错误:向C++构造函数传参触发C2059语法错误

解决C++构造函数传参时的C2059语法错误

你碰到的这个C2059: syntax error: 'constant'错误,核心问题是在类定义里用错了非静态成员变量的初始化语法,编译器把你的代码当成了函数声明,而非成员变量的初始化操作。

错误原因拆解

看你在CTest2里写的这行代码:

CTest1 test1(BITMAP_1_ID, BITMAP_2_ID); // Compile error here

在C++类的定义范围内,类型 名称(参数)这种语法会被编译器解析成成员函数声明——它会认为你要定义一个返回CTest1类型、名为test1的函数,参数是两个BITMAP_1_IDBITMAP_2_ID类型的变量。但这俩是宏定义的常量,根本不能作为函数参数的类型,所以直接触发了语法错误。

两种可行的解决方案

方案1:用C++11及以上支持的类内成员初始化

VS2017完全支持C++11,你可以用大括号{}或者等号=的方式,直接在类内完成成员变量的初始化:

#define BITMAP_1_ID 1
#define BITMAP_2_ID 2

class CTest1 {
public:
    CTest1(const int i8BitImageID, const int i256BitImageID) 
        : m_i8BitImageID(i8BitImageID), m_i256BitImageID(i256BitImageID) {};
private:
    int m_i8BitImageID;
    int m_i256BitImageID;
};

class CTest2 {
public:
    // 推荐用大括号初始化,避免语法歧义
    CTest1 test1{BITMAP_1_ID, BITMAP_2_ID};
    // 也可以用等号+构造函数调用的方式
    // CTest1 test1 = CTest1(BITMAP_1_ID, BITMAP_2_ID);
};

方案2:在CTest2的构造函数中使用初始化列表

如果你更习惯传统写法,或者需要根据不同逻辑初始化test1,可以在CTest2的构造函数里通过成员初始化列表来完成:

#define BITMAP_1_ID 1
#define BITMAP_2_ID 2

class CTest1 {
public:
    CTest1(const int i8BitImageID, const int i256BitImageID) 
        : m_i8BitImageID(i8BitImageID), m_i256BitImageID(i256BitImageID) {};
private:
    int m_i8BitImageID;
    int m_i256BitImageID;
};

class CTest2 {
public:
    // 通过构造函数初始化列表初始化test1
    CTest2() : test1(BITMAP_1_ID, BITMAP_2_ID) {}
private:
    // 先声明成员变量
    CTest1 test1;
};

补充说明

你之前调整构造函数的const修饰符没用,是因为问题根本不在构造函数本身,而是CTest2里成员变量的声明/初始化语法错了,和构造函数参数是否加const完全无关。

内容的提问来源于stack exchange,提问作者Steve A

火山引擎 最新活动