作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#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/
我是一名优秀的程序员,十分优秀!