自定义结构体数组赋值触发C3863错误,咨询DATE类型兼容性
问题分析与解决方案
编译错误根源
C++中数组类型不支持直接赋值操作,你代码里的:
j->tx_tech_variable_vec = tx_tech_variable_vec; j->tx_tech_variable_dates_vec = tx_tech_variable_dates_vec;
属于直接对数组执行赋值操作,这是语法不允许的。虽然数组名在表达式中会隐式转为指向首元素的指针,但结构体中声明的是固定大小的数组(而非指针),因此无法通过指针/另一个数组直接完成赋值。
关于数组长度的疑问
不需要额外显式指定长度——你在结构体和局部变量中都明确声明了[8]的数组长度,二者长度完全匹配,问题与长度无关,仅出在赋值方式上。
DATE类型与std::array/std::vector的兼容性
DATE本质是div_t类型(POD结构体),完全兼容std::array或std::vector:
std::array<DATE, 8>与原生数组DATE[8]内存布局完全一致,可通过data()方法获取原生指针,能无缝适配现有代码;std::vector<DATE>作为动态数组,只要初始化时分配足够空间,也能正常存储DATE类型。
但考虑到你项目已有9万行代码依赖原生数组和DATE结构,无需更换容器,修改赋值方式即可解决问题。
代码修复方案
方案一:手动遍历赋值(直观易读)
适合固定长度的小数组:
// 复制double类型数组 for (int i = 0; i < 8; ++i) { j->tx_tech_variable_vec[i] = tx_tech_variable_vec[i]; } // 复制DATE类型数组 for (int i = 0; i < 8; ++i) { j->tx_tech_variable_dates_vec[i] = tx_tech_variable_dates_vec[i]; }
方案二:标准库批量复制(高效简洁)
使用std::copy(需包含<algorithm>头文件):
#include <algorithm> // 复制double数组 std::copy(std::begin(tx_tech_variable_vec), std::end(tx_tech_variable_vec), std::begin(j->tx_tech_variable_vec)); // 复制DATE数组 std::copy(std::begin(tx_tech_variable_dates_vec), std::end(tx_tech_variable_dates_vec), std::begin(j->tx_tech_variable_dates_vec));
方案三:C风格内存复制(性能最优,仅限POD类型)
DATE是POD类型,可使用memcpy(需包含<cstring>头文件):
#include <cstring> // 复制double数组 memcpy(j->tx_tech_variable_vec, tx_tech_variable_vec, sizeof(tx_tech_variable_vec)); // 复制DATE数组 memcpy(j->tx_tech_variable_dates_vec, tx_tech_variable_dates_vec, sizeof(tx_tech_variable_dates_vec));
内容的提问来源于stack exchange,提问作者babipsylon
相关产品推荐
相关产品推荐

