memcpy 写入“class uint256”类型的对象
memcpy writing to an object of type ‘class uint256’
好吧,这可能是一个非常简单的修复警告,但我还没有弄明白。前段时间,我对我的 uint256
class 进行了更新,之后,我收到了这个警告:
base58.h:261:52: warning: ‘void* memcpy(void*, const void*, size_t)’ writing to an object of type ‘class uint256’ with no trivial copy-assignment; use copy-assignment or copy-initialization instead [-Wclass-memaccess]
memcpy(&id, &vchData[0], HASH_LEN_BYTES);
这是 memcpy 所在的函数:
bool GetKeyID(CKeyID &keyID) const {
if (!IsValid())
return false;
switch (nVersion) {
case PUBKEY_ADDRESS:
case PUBKEY_ADDRESS_TEST: {
uint256 id;
memcpy(&id, &vchData[0], HASH_LEN_BYTES);
keyID = CKeyID(id);
return true;
}
default: return false;
}
}
这是我的 uint256 class: uint256.h
有两种替代解决方案:
- 使 class 易于复制。
- 不要尝试 memcpy class。
how i can replace memcpy on this context?
编写一个接受任何 vchData
作为参数的构造函数。
how i can make the class trivially copyable?
删除复制构造函数和任何不可简单复制的成员/基。
您已经为 base_uint<N>
class here
定义了复制分配
以及 base_uint
here, and a conversion constructor uint256
here
的复制构造函数
此外,如果您只是将 (uint256*)
参数转换为 (void*)
,警告将消失,您将获得预期的行为,但这不是推荐的方法,因为它可能会无声地中断将来如果你真的在作业中做出不同的东西。我认为最好的是删除那些复制构造函数和赋值运算符。在我看来,唯一有趣的运算符是 base_uint
不同宽度之间的转换。
好吧,这可能是一个非常简单的修复警告,但我还没有弄明白。前段时间,我对我的 uint256
class 进行了更新,之后,我收到了这个警告:
base58.h:261:52: warning: ‘void* memcpy(void*, const void*, size_t)’ writing to an object of type ‘class uint256’ with no trivial copy-assignment; use copy-assignment or copy-initialization instead [-Wclass-memaccess]
memcpy(&id, &vchData[0], HASH_LEN_BYTES);
这是 memcpy 所在的函数:
bool GetKeyID(CKeyID &keyID) const {
if (!IsValid())
return false;
switch (nVersion) {
case PUBKEY_ADDRESS:
case PUBKEY_ADDRESS_TEST: {
uint256 id;
memcpy(&id, &vchData[0], HASH_LEN_BYTES);
keyID = CKeyID(id);
return true;
}
default: return false;
}
}
这是我的 uint256 class: uint256.h
有两种替代解决方案:
- 使 class 易于复制。
- 不要尝试 memcpy class。
how i can replace memcpy on this context?
编写一个接受任何 vchData
作为参数的构造函数。
how i can make the class trivially copyable?
删除复制构造函数和任何不可简单复制的成员/基。
您已经为 base_uint<N>
class here
以及 base_uint
here, and a conversion constructor uint256
here
此外,如果您只是将 (uint256*)
参数转换为 (void*)
,警告将消失,您将获得预期的行为,但这不是推荐的方法,因为它可能会无声地中断将来如果你真的在作业中做出不同的东西。我认为最好的是删除那些复制构造函数和赋值运算符。在我看来,唯一有趣的运算符是 base_uint
不同宽度之间的转换。