传递向量指针并循环它以更改其值

Passing a vector pointer and looping it to change its value

提问人:Icaro 提问时间:7/16/2022 最后编辑:Vlad from MoscowIcaro 更新时间:7/16/2022 访问量:173

问:

我正在尝试将向量传递给函数,循环访问它,并在将其发送回去之前修改值,但是我很难使用它并使其工作:pointerreference

我知道这是一个指针。我对 .我相信它是一个 ,但我不断收到错误:itrresourcefor loopreference

error: no viable overloaded '='resource = resource + value

ACTION test::addto(name player){  
    
  auto itr = player.require_find(wallet.value, USER_NOT_FOUND(wallet));
    
  asset value1 = asset(100, ACTION_SYMBOL);
  asset value2 = asset(100, FOOD_SYMBOL);
    
  changeResourceValue(itr->resources, value1);
  changeResourceValue(itr->resources, value2);
    
  player.modify(itr, _self, [&](auto& p) { 
      p.resources = resources;
  });
}

void changeResourceValue(const vector<asset>* resources, asset value){
   for (auto &resource : *resources){
      if(resource.symbol == value.symbol){
         resource = resource + value;
      }
   }
}
C++ 编译器错误 引用 stdvector 赋值运算符

评论

0赞 PaulMcKenzie 7/16/2022
这绝对不是代码。C
0赞 PaulMcKenzie 7/16/2022
我知道 itr 是一个指针——不,是一个迭代器。迭代器并不一定意味着它是一个指针。它可以使用类似指针的语法(取消引用等),但仅此而已。那么,这句话的意图是什么呢?如果你发布一个最小的可重现的例子,或者至少指出正在使用的变量类型,那就更好了。现在,我们看到的只是 ,这并不能表明实际类型是什么。itrresource = resource + value;auto itr
0赞 Sam Varshavchik 7/16/2022
此问题显示的代码无法满足 Stackoverflow 对显示最小可重现示例的要求。正因为如此,这里的任何人都不太可能最终回答这个问题;但最多只能猜测。您需要编辑您的问题以显示一个最小的示例,不超过一两页代码(“最小”部分),其他人可以完全按照所示进行剪切/粘贴、编译、运行和重现所描述的问题(“可重现”部分,这包括任何辅助信息,例如对程序的任何输入)。有关详细信息,请参阅如何询问
1赞 user4581301 7/16/2022
如果要更改数据,为什么要传递数据?const
0赞 PaulMcKenzie 7/16/2022
我正在尝试将一个向量传递给一个函数,循环它,并在将其发送回去之前修改值 - 然后你应该做的第一件事是编写一个简单的程序并使用它,直到你得到你想要的结果。一旦你让简单的程序工作,你就使用它。如果您无法让简单的程序工作,请在此处发布该程序,我们将对其进行研究(从而满足最低限度的可重现示例要求)。

答:

0赞 numzero 7/16/2022 #1

IIUC,确实是一个参考,但不是因为你有一个(指针)向量。如果你想改变一个向量,不要假装你没有,即传递一个常规的、非常量的指针。resourceconst assetassetconst

评论

0赞 Icaro 7/16/2022
如果我删除 const,我会收到错误:note: candidate function not viable: no known conversion from 'const vector<eosio::asset>' to 'vector<eosio::asset> *' for 1st argument
1赞 Vlad from Moscow 7/16/2022 #2

对于初学者,函数的第一个参数是用限定符声明的changeResourceValueconst

void changeResourceValue(const vector<asset>* resources, asset value){

这意味着您不能更改指针指向的向量的元素。resources

因此,您至少需要删除限定符 .const

第二个问题是没有为 类型的对象定义运算符 =。也许错误消息是变量是常量引用的结果。assetresource

此外,您还需要检查成员函数是否在此记录中返回指针或迭代器require_find

auto itr = player.require_find(wallet.value, USER_NOT_FOUND(wallet));

已定义迭代器的旧 C++ 版本作为指针。但在新版本的迭代器中,指针不是指针。std::vectorstd::vector

所以也许该函数应该声明如下

void changeResourceValue( std::vector<asset>::iterator resources, asset value);

评论

0赞 Icaro 7/16/2022
如果我删除常量,我会得到 如果我添加我得到的error: note: candidate function not viable: no known conversion from 'const vector<eosio::asset>' to 'vector<eosio::asset> *' for 1st argument,::iteratorerror: invalid range expression of type 'std::__1::__wrap_iter<eosio::asset *>'; no viable 'begin' function available
0赞 Icaro 7/16/2022
我也尝试将迭代器作为这样的指针,但我收到错误vector<asset>* p = *itr->resources;error: indirection requires pointer operand ('const vector<eosio::asset>' invalid) vector<asset>* p = *itr->resources;
1赞 Vlad from Moscow 7/16/2022
@Icaro 如果向量是常数,那么这个函数就没有意义了。你做错了什么。您不能更改常量向量。
1赞 Vlad from Moscow 7/16/2022
@Icaro 检查成员函数require_find是否使用限定符 const 声明。如果是这样,那么你需要在没有限定符 const 的情况下重载它。
0赞 Icaro 7/16/2022
就是这样!我与 Node 一起使用,这意味着您不能更改它所指向的引用,但您可以更改它的内容。让我重写它以使其现在工作,非常感谢您的帮助。const