目标-C++;can';t在枚举块内使用向量推回 bar.mm 编辑: std::vector*vector={}; [URI enumerateObjectsUsingBlock:^(NSString*\u非空对象,NSU整数idx,BOOL*\u非空停止){ std::string str=std::string([obj UTF8String]); 向量->推回(str); }]; 使用指针似乎是一种解决方法。< P>块通过复制复制构造函数来复制本地C++变量,然后在块中是const。

目标-C++;can';t在枚举块内使用向量推回 bar.mm 编辑: std::vector*vector={}; [URI enumerateObjectsUsingBlock:^(NSString*\u非空对象,NSU整数idx,BOOL*\u非空停止){ std::string str=std::string([obj UTF8String]); 向量->推回(str); }]; 使用指针似乎是一种解决方法。< P>块通过复制复制构造函数来复制本地C++变量,然后在块中是const。,c++,objective-c,objective-c++,C++,Objective C,Objective C++,封装词法作用域的局部堆栈(非静态)变量被捕获为常量变量 如果使用块内的任何其他基于C++的堆栈对象,则 必须具有常量副本构造函数。然后复制C++对象 使用该构造函数 这意味着在块内只能调用标记为const的uri向量的方法(例如size()) 您可以使用\u块存储说明符允许在块内修改变量 // this will allow it to be modified within capturing blocks __block std::vector<std::string> uris

封装词法作用域的局部堆栈(非静态)变量被捕获为常量变量

如果使用块内的任何其他基于C++的堆栈对象,则 必须具有常量副本构造函数。然后复制C++对象 使用该构造函数

这意味着在块内只能调用标记为const的
uri
向量的方法(例如
size()

您可以使用
\u块
存储说明符允许在块内修改变量

// this will allow it to be modified within capturing blocks
__block std::vector<std::string> uris;
//这将允许在捕获块内对其进行修改
__块std::向量uri;

你也可以用循环而不是块来迭代数组。

Ah,很好。顺便说一下,使用指针似乎是一种解决方法?请参阅上面的“我的编辑”。@ZigiiWong是的,指针将标记为const,但这仍然允许您修改它指向的实例(只是不重新指定指针)。我更喜欢
\uu block
而不是指针,这样您就不必根据代码的位置更改指针语法。
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);
}];
// this will allow it to be modified within capturing blocks
__block std::vector<std::string> uris;