我想在使用循环时保持对unique_ptr的引用,这样在我离开循环后我仍然保持引用.我知道我不能创建unique_ptr的新副本(显然),所以我想做的是:
const unique_ptr<Object>& ref;
for(auto& s : stuff) {
if(condition) {
ref = std::move(s);
}
}
Run Code Online (Sandbox Code Playgroud)
我意识到这将永远不会起作用,因为ref必须在声明时初始化,如果它是一个const,但在同一个动作中我不能保持对unique_ptr的引用,除非它是一个const unique_ptr&type如果我没有弄错的话.我最终做的是:
Object* ref = nullptr;
for(auto& s : stuff) {
if(condition) {
ref = s.get();
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个正确的解决方案还是我应该考虑使用shared_ptr来完成这项工作?
运行忍者时,我在下面收到此忍者构建错误。我的CMAKE构建命令是cmake -G"Ninja" -DCMAKE_BUILD_TYPE=Release。
ninja: error: 'ext_deps/api/src/ext_api/build/src/lib/libapi.a', needed by 'Project', missing and no known rule to make it
Run Code Online (Sandbox Code Playgroud)
假设我的项目由一个API(通过CMAKE从GitHub下载)和实现(该项目)组成。
The layout would look like:
Project/
-- build/
-- cmake/modules
----- ExternalDep.cmake
----- FindAPI.cmake
-- CMakeLists.txt
-- src/
---- CMakeLists.txt
-- include/
Run Code Online (Sandbox Code Playgroud)
假设在顶层,CMakeLists.txt我通常执行设置构建设置,CXX标志等的工作,然后调用include(ExternalDep),它检查“ API”库是否在用户系统中(如果不是,则通过CMAKE下载) )。在src/CMakeLists.txt我尝试使用
target_link_libraries(${PROJECT_NAME} PRIVATE ${API_LIBRARY})
Run Code Online (Sandbox Code Playgroud)
我遇到的第一个问题是,在甚至可以下载和构建“ API”库之前,我会收到上面发布的忍者构建错误。我很肯定在ExternalDep.cmake尝试添加Project可执行文件并针对“ API”库进行链接之前已将其包含在内。
这是的简化版本ExternalDep.cmake:
set(EXT_DEPS_PREFIX "ext_deps")
ExternalProject_Add(ext_lib
GIT_REPOSITORY "https://github.com/fake/api.git"
GIT_TAG "master"
PREFIX "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api"
TMP_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api-tmp"
STAMP_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api-stamp"
CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
SOURCE_DIR "${CMAKE_BINARY_DIR}/${EXT_DEPS_PREFIX}/api/ext_api"
BINARY_DIR …Run Code Online (Sandbox Code Playgroud) 我在Android Studio中创建了一个新文件(扩展名为.frag),弹出了一个"注册新文件类型关联"窗口.我没有注意,我选择了"在相关应用程序中打开匹配文件",现在这样做,所以当我尝试打开它在Gedit中打开的*.frag文件时(我在文件创建时打开) .我检查了设置中的文件类型,但我没有看到更改关联定义的选项.我希望我的*.frag文件在Android Studio中打开.