gpt4 book ai didi

c++ - Objective-C++ 不能在枚举 block 中使用 vector push_back

转载 作者:行者123 更新时间:2023-11-30 02:18:35 24 4
gpt4 key购买 nike

杆.mm

#include <stdlib.h>
#include <string>
#include <vector>

+ (BOOL)addURIs:(NSArray<NSString *>*)URIs {
std::vector<std::string> uris;
uris.push_back("1234"); // works!

[URIs enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
std::string str = std::string([obj UTF8String]);
uris.push_back(str); // error: No matching member function for call to 'push_back'
}];
return YES;
}

我目前使用 objective-c++ 将 C++ 库桥接到 Objecitve-C。

我创建了一个包含字符串的 vector 并尝试 push_back 另一个字符串。

为什么第一次 push_back 成功而第二次 push_back 出现错误?

No matching member function for call to 'push_back'

编辑:

std::vector<std::string> *vector = {};
[URIs enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
std::string str = std::string([obj UTF8String]);
vector->push_back(str);
}];

使用指针似乎是一种解决方法。

最佳答案

block 通过使用复制构造函数复制它们来捕获局部 C++ 变量,然后它们在 block 中是常量 See Reference:

Stack (non-static) variables local to the enclosing lexical scope are captured as const variables.

...

If you use any other C++ stack-based object from within a block, it must have a const copy constructor. The C++ object is then copied using that constructor.

这意味着在 block 内您只能调用标记为 const 的 uris vector 的方法(例如 size())。

您可以使用 __block 存储说明符来允许在 block 内修改变量。

// this will allow it to be modified within capturing blocks
__block std::vector<std::string> uris;

您也可以只使用循环而不是 block 来迭代数组。

关于c++ - Objective-C++ 不能在枚举 block 中使用 vector push_back,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51997366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com