赋值中与结构数据不兼容的类型(相同类型!

Incompatible types in assignment with struct's data (same type!)

本文关键字:类型 同类型 不兼容 结构 数据 赋值      更新时间:2023-10-16

我有一个结构体:

struct record {
  char team[40];
}

我试着把它的属性复制到另一个struct。

struct record rec2;
struct record rec;
rec.team = rec2.team;

但是,我在rec.team = rec2.team行得到以下编译时错误:

error: incompatible types in assignment

如果硬编码这些值,也会出现同样的问题。

我的理解是这是不可能的,但它显然正在发生。

数组不可赋值。

假设你真的在使用c++,一个明显的选择是使用std::vectorstd::string,这两个都是可分配的。

如果你不能这样做,你可以创建一些类作为你的数组的包装器,然后在你的record中包含该类的实例。正如Jonathan Leffler提醒我们的那样,将数组包装在struct中使其可赋值,即使数组本身不是可赋值的。

如果由于某种原因不能这样做,可以使用std::copy(在c++中)或memcpy(在C中)来复制数组的内容。至少在我看来,这应该是您最后的选择,因为它将正确地将数据从一个字段复制到另一个字段的负担放在了代码的用户身上,而不是让代码为用户提供方便。

数组没有复制赋值操作符。你应该把一个数组复制到另一个数组。在你的例子中你可以简单地为一个结构分配另一个结构也就是你可以简单地写

rec = rec2;

似乎你正在使用C代码,然后复制数组,你应该使用标头<string.h>声明的标准函数memcpy

例如

memcpy( rec.team, rec2.team, 40 );

或者如果数组包含字符串,那么您可以使用strcpystrncpy函数。例如

strcpy( rec.team, rec2.team );

如果你正在使用c++,那么你也可以使用标准函数std::strcpystd::strncpy,因为数组是结构体的公共数据成员。不需要声明构造函数。另一种方法是使用标准类std::array。例如

#include <array>
struct record{
std::array<char, 40> team;
};
record rec, rec2;
//.. some other code
rec = rec2;

注意,当声明一些type a[N]数组时:

  1. 不能将a设置为其他值
  2. a的值等于a的地址

与其他类型的变量不同,数组左值

因此,本质上,可以将数组的名称视为常量标签。

如果你想复制一个数组的内容到另一个数组,那么你可以使用任何标准的内存复制例程,或者自己实现它。

示例# 1:

memcpy(rec.team,rec2.team,40*sizeof(char));

例2:

for (int i=0; i<40; i++)
    rec.team[i] = rec2.team[i];