CUDA 11.8无法编译派生类成员初始化问题咨询
问题解决:CUDA 11.8编译派生类聚合初始化报错
问题原因
CUDA的NVCC编译器对C标准特性的支持存在滞后,你代码里的派生类聚合初始化是**C17及以后才正式支持**的特性——允许无用户定义构造函数的派生类直接用列表初始化基类成员。而NVCC 11.8默认的编译标准可能未开启到C++17,导致无法识别这种写法,抛出初始化值过多的错误。
解决方法
1. 强制启用C++17及以上标准编译
在编译命令中添加--std=c++17(或更高版本如c++20)选项,让NVCC遵循C++17的聚合初始化规则:
nvcc --std=c++17 your_code.cu -o output
此方法无需修改代码,且不会破坏B作为__constant__变量的兼容性(仍保持聚合类属性)。
2. 显式初始化基类子对象(兼容旧标准)
如果无法升级编译标准,可改用C++11及以后都支持的显式基类初始化写法:
struct A { int x, y; }; struct B : public A { }; int main() { B b { {10, 20} }; // 显式包裹基类A的初始化列表 }
这种写法同样保持B的聚合类属性,不影响其作为__constant__变量使用。
关键说明
两种方案都满足你“不能添加构造函数”的需求——因为聚合类的定义要求不能有用户自定义构造函数、析构函数等,上述修改均未违反这一规则。
内容的提问来源于stack exchange,提问作者RainerMtb
相关产品推荐
相关产品推荐

