问题描述
嗯,这可能是一个非常简单的警告来修复,但我还没有弄清楚。前段时间,我对 uint256
类进行了更新,之后,我收到此警告:
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);
bool GetKeyID(CKeyID &keyID) const {
if (!IsValid())
return false;
switch (nVersion) {
case PUBKEY_ADDRESS:
case PUBKEY_ADDRESS_TEST: {
uint256 id;
memcpy(&id,HASH_LEN_BYTES);
keyID = CKeyID(id);
return true;
}
default: return false;
}
}
这是我的 uint256 类:uint256.h
解决方法
有两种替代解决方案:
- 使类变得可简单复制。
- 不要尝试 memcpy 类。
如何在这种情况下替换 memcpy?
编写一个构造函数,接受任何 vchData
作为参数。
我怎样才能让这个类变得简单可复制?
删除复制构造函数和任何不可复制的成员/基类。
,您已经为 base_uint<N>
类 here
还有一个 base_uint
here 的复制构造函数,以及一个转换构造函数 uint256
here
此外,如果您只是将 (uint256*)
参数强制转换为 (void*)
,警告将消失,您将获得预期的行为,但这不是推荐的方法,因为它可能会在未来,如果你真的在任务中做出了一些不同的事情。我认为最好的是删除那些复制构造函数和赋值运算符。在我看来,唯一有趣的运算符是不同宽度的 base_uint
之间的转换。