赋值中与结构数据不兼容的类型(相同类型!
Incompatible types in assignment with struct's data (same type!)
我有一个结构体:
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::vector
或std::string
,这两个都是可分配的。
如果你不能这样做,你可以创建一些类作为你的数组的包装器,然后在你的record
中包含该类的实例。正如Jonathan Leffler提醒我们的那样,将数组包装在struct中使其可赋值,即使数组本身不是可赋值的。
如果由于某种原因不能这样做,可以使用std::copy
(在c++中)或memcpy
(在C中)来复制数组的内容。至少在我看来,这应该是您最后的选择,因为它将正确地将数据从一个字段复制到另一个字段的负担放在了代码的用户身上,而不是让代码为用户提供方便。
数组没有复制赋值操作符。你应该把一个数组复制到另一个数组。在你的例子中你可以简单地为一个结构分配另一个结构也就是你可以简单地写
rec = rec2;
似乎你正在使用C代码,然后复制数组,你应该使用标头<string.h>
声明的标准函数memcpy
memcpy( rec.team, rec2.team, 40 );
或者如果数组包含字符串,那么您可以使用strcpy
或strncpy
函数。例如
strcpy( rec.team, rec2.team );
如果你正在使用c++,那么你也可以使用标准函数std::strcpy
或std::strncpy
,因为数组是结构体的公共数据成员。不需要声明构造函数。另一种方法是使用标准类std::array
。例如
#include <array>
struct record{
std::array<char, 40> team;
};
record rec, rec2;
//.. some other code
rec = rec2;
注意,当声明一些type a[N]
数组时:
- 不能将
a
设置为其他值 -
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];
- 是否可以根据其数据成员的类型确定类型的大小
- 如何对命名空间限定类型进行类型定义?
- 如何在C++中允许成员函数的自定义返回类型进行类型擦除?
- 类型名称 T::类型::值中的预期非限定 id
- if(双精度类型 == 字符类型)
- 模板冲突的类型-但类型应该是相同的cfr类层次结构
- 如何在模板参数中分离函数类型返回类型和参数
- 对于类型类::类型,我可以从常量类派生常量类::类型吗?
- 包装任意类型/非类型模板类的模板类
- C++ 类型 * 和类型 *&在函数中的区别是什么
- C++ 按非类型参数类型划分的模板专用化
- 如何进行编译时type_check并且仅在类成员的类型与类型匹配时才编译类的一部分?
- 另一个:从"常量类型*"到"类型*"的转换无效
- 类型长的长度和未解决的超载函数类型的类型的操作数与二进制运算符
- 仅为某些模板专用化定义转换运算符:预期类型/预期类型说明符
- 包含类型的类型的模板函数重载
- static_cast实际上不是对象类型的类型是未定义的行为吗?
- 从参数的返回类型推断类型
- 使用抽象基类型C++进行类型推断
- 将任何类型的类型转换为字符串 c++