Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 加密++;AutoSeedRandomPool复制构造函数隐式删除_C++11_Constructor_Crypto++_Dsa - Fatal编程技术网

C++11 加密++;AutoSeedRandomPool复制构造函数隐式删除

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

我的问题是关于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 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、 很明显,它们是不可复制的。谢谢,就是这样。我不知道关于复制构造函数的事实。