提问人:Icaro 提问时间:7/16/2022 最后编辑:Vlad from MoscowIcaro 更新时间:7/16/2022 访问量:173
传递向量指针并循环它以更改其值
Passing a vector pointer and looping it to change its value
问:
我正在尝试将向量传递给函数,循环访问它,并在将其发送回去之前修改值,但是我很难使用它并使其工作:pointer
reference
我知道这是一个指针。我对 .我相信它是一个 ,但我不断收到错误:itr
resource
for loop
reference
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;
}
}
}
答:
0赞
numzero
7/16/2022
#1
IIUC,确实是一个参考,但不是因为你有一个(指针)向量。如果你想改变一个向量,不要假装你没有,即传递一个常规的、非常量的指针。resource
const asset
asset
const
评论
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
对于初学者,函数的第一个参数是用限定符声明的changeResourceValue
const
void changeResourceValue(const vector<asset>* resources, asset value){
这意味着您不能更改指针指向的向量的元素。resources
因此,您至少需要删除限定符 .const
第二个问题是没有为 类型的对象定义运算符 =。也许错误消息是变量是常量引用的结果。asset
resource
此外,您还需要检查成员函数是否在此记录中返回指针或迭代器require_find
auto itr = player.require_find(wallet.value, USER_NOT_FOUND(wallet));
已定义迭代器的旧 C++ 版本作为指针。但在新版本的迭代器中,指针不是指针。std::vector
std::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,
::iterator
error: 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
下一个:使用对象切片进行有效分配
评论
C
itr
resource = resource + value;
auto itr
const