C++11 加密++;AutoSeedRandomPool复制构造函数隐式删除
我的问题是关于crypto++构造函数,以及为什么它处于“隐式删除”状态,即使它遵循文档中提供的示例 我试图摆脱上的示例提供的代码,但调用AutoSeedAndomPool对象的构造函数时遇到问题。 这是我正在呼叫终端的命令:C++11 加密++;AutoSeedRandomPool复制构造函数隐式删除,c++11,constructor,crypto++,dsa,C++11,Constructor,Crypto++,Dsa,我的问题是关于crypto++构造函数,以及为什么它处于“隐式删除”状态,即使它遵循文档中提供的示例 我试图摆脱上的示例提供的代码,但调用AutoSeedAndomPool对象的构造函数时遇到问题。 这是我正在呼叫终端的命令: g++ -I /usr/local/include/ -l cryptopp -std=c++11 -c -o build/account.o src/account.cpp 我得到以下错误: error: call to implicitly-deleted co
g++ -I /usr/local/include/ -l cryptopp -std=c++11 -c -o build/account.o src/account.cpp
我得到以下错误:
error: call to implicitly-deleted copy constructor of 'CryptoPP::AutoSeededRandomPool',
note: copy constructor of 'AutoSeededRandomPool' is implicitly deleted because base
class 'CryptoPP::RandomPool' has a deleted copy constructor
此外,我得到了一个不同寻常的信息:
clang: warning: -lcryptopp: 'linker' input unused [-Wunused-command-line-argument]
下面是我用来生成公钥/私钥对的文件。他们基本上遵循了以下示例:
DSA::PrivateKey create_private_key(AutoSeededRandomPool rng) {
DSA::PrivateKey private_Key;
private_Key.GenerateRandomWithKeySize(rng, 1024);
return private_Key;
}
DSA::PublicKey create_public_key(DSA::PrivateKey private_key, AutoSeededRandomPool rng) {
DSA::PublicKey public_Key;
public_Key.AssignFrom(private_key);
if (!private_key.Validate(rng, 3) || !public_Key.Validate(rng, 3))
{
throw std::runtime_error("DSA key generation failed");
}
return public_Key;
}
我在构造函数中声明并初始化autoseedrandompool
对象,如下所示:
account::account() {
balance = 0;
AutoSeededRandomPool rng;
private_key = utils::create_private_key(rng);
public_key = utils::create_public_key(private_key, rng);
}
我已经链接了实现这一点所需的库,当我调用g++时,我正在链接它们。此外,如果有人知道是否有更详细的加密++代码示例,我们将非常感谢这些资源
叮当声:警告:-lcryptopp:“链接器”输入未使用
尝试:
省略-l cryptopp
。它只在链接期间需要
错误:调用隐式删除的构造函数副本 “CryptoPP::AutoSeedRandomPool”,注意:复制的构造函数 “AutoSeedAndOMPool”被隐式删除,因为基类 “CryptoPP::RandomPool”具有已删除的副本构造函数 通过引用传递
rng
:
DSA::PrivateKey create_private_key(AutoSeededRandomPool& rng) {
...
}
在create_private_key
和create_public_key
中执行此操作
原因是,autoseedrandompool
基类是RandomPool
,而RandomPool
基类是NotCopyable
<代码>不可复制通过将副本和分配设置为私有来隐藏它们。我想这就是“隐式”部分来自编译器错误的地方
class RandomPool : public RandomNumberGenerator, public NotCopyable
{
...
}
如果不希望通过引用传递,请在本地创建一个。在生成私钥时,希望这样做的原因有很多。有关更多详细信息,请参阅
DSA::PrivateKey create_private_key() {
AutoSeededRandomPool rng;
DSA::PrivateKey private_Key;
private_Key.GenerateRandomWithKeySize(rng, 1024);
return private_Key;
}
相关,链接时,将
-lcryptopp
放在命令末尾。比如:
g++ -o myprog -std=c++11 build/account.o build/some-other-object.o -lcryptopp -pthread
顺序很重要,因为LD是单通道链接器。图书馆总是放在最后。您可以使用诸如-(
和-“开始组”
之类的选项来解决这个问题,但是很容易记住将库放在末尾
C++11的另一个背景故事是,当您遇到隐式删除的复制构造函数时,通常会在类中定义一个 但是,在
autoseedrandomool
的情况下,出于几个原因,我们不希望复制它们。Crypto++算法
类是autoseedrandomool
的基类,它有一个克隆
。但是,我们也不希望克隆生成器。再次,请参阅
叮当声:警告:-lcryptopp:“链接器”输入未使用
尝试:
省略-l cryptopp
。仅在链接期间需要
错误:调用隐式删除的构造函数副本 “CryptoPP::AutoSeedRandomPool”,注意:复制的构造函数 “AutoSeedAndOMPool”被隐式删除,因为基类 “CryptoPP::RandomPool”具有已删除的副本构造函数 通过引用传递
rng
:
DSA::PrivateKey create_private_key(AutoSeededRandomPool& rng) {
...
}
在create_private_key
和create_public_key
中执行此操作
原因是,autoseedrandompool
基类是RandomPool
,RandomPool
基类是NotCopyable
,NotCopyable
通过将复制和赋值设为私有来隐藏它们。我想这就是编译器错误中“隐式”部分的原因
class RandomPool : public RandomNumberGenerator, public NotCopyable
{
...
}
如果不希望通过引用传递,请在本地创建一个。生成私钥时,希望通过引用传递有一定原因。有关详细信息,请参阅
DSA::PrivateKey create_private_key() {
AutoSeededRandomPool rng;
DSA::PrivateKey private_Key;
private_Key.GenerateRandomWithKeySize(rng, 1024);
return private_Key;
}
相关,链接时,将
-lcryptopp
放在命令末尾。类似于:
g++ -o myprog -std=c++11 build/account.o build/some-other-object.o -lcryptopp -pthread
顺序很重要,因为LD是一个单通道链接器。库始终位于末尾。您可以使用诸如-(
和--start group
之类的选项来解决此问题,但很容易记住将库放置在末尾
C++11的另一个背景故事是,当您遇到隐式删除的复制构造函数时,通常会在类中定义一个
但是,在
autoseedrandomool
的情况下,出于几个原因,我们不希望复制它们。Crypto++算法
类是autoseedrandomool
的基类,它有一个克隆
。但是,我们也不希望克隆生成器。再次,请参见。为什么不尝试传递参数by引用而不是值?如果按值传递,则隐式调用复制构造函数,显然它们不可复制。谢谢,就是这样。我不知道有关复制构造函数的事实。为什么不尝试按引用而不是值传递参数?如果按值传递,则隐式调用复制构造函数r、 很明显,它们是不可复制的。谢谢,就是这样。我不知道关于复制构造函数的事实。