命名空间“std”中没有名为“unary_function”的模板;你是说“__unary_function”吗?

No template named 'unary_function' in namespace 'std'; did you mean '__unary_function'?

提问人:Mitesh Baraiya 提问时间:9/19/2023 最后编辑:Mitesh Baraiya 更新时间:11/18/2023 访问量:22023

问:

刚刚将我的 Xcode 升级到 15.0,突然它开始给我以下错误RCT_Folly

No template named 'unary_function' in namespace 'std'; did you mean '__unary_function'?

这是它失败的行:

结构hash_base:std::unary_function<T, std::size_t> {};

我尝试删除缓存数据和派生数据并清理构建。也尝试删除豆荚和node_modules。但没有任何帮助。

iOS Xcode 反应原生 Xcode15

评论


答:

16赞 Mitesh Baraiya 9/19/2023 #1

这有点傻,但我通过按照 XCode 的建议来解决它。__unary_function

所以实际的线是......

结构hash_base:std::__unary_function<T, std::size_t> {};

评论

2赞 Matt Roberts 9/19/2023
是的,我现在也得到了这个 - 这个“修复”有效,我想知道它是否会被纳入 RN 的官方内容......
2赞 Mitesh Baraiya 9/19/2023
@MattRoberts同意,每次 Xcode 更新时,我们都会不断收到新的愚蠢错误。
1赞 JeremyP 9/19/2023
@MiteshBaraiya 这不是一个“愚蠢的错误”。它在 C++11 中被弃用,并在 C++17 中删除。我猜 Clang 刚刚赶上了 C++17。
0赞 Jamal Ud Din 9/22/2023
同样的问题。我已经改变了它,现在它可以工作了。但它对其他代码有一些影响。
0赞 Mitesh Baraiya 9/22/2023
就在@JamalUdDin,我也是这么想的,因为我们将在代码中使用已删除的函数。但我想使用它是他们正式修复 RN 之前的唯一方法
8赞 tetar 9/19/2023 #2

所有库都必须更新其代码以使用 std::function 和 std::bind 而不是 unary_function

解决方法

选择 Pod > Build Settings > 在“宏”部分下的“Apple Clang - 预处理>”部分中

 preview add line

添加 Release & Debug -> _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION

PS:要添加这个,只需在列上CLIC,然后在底部的“+”上添加CLIC->然后粘贴:_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION preview add line

评论

0赞 Mitesh Baraiya 9/19/2023
我之前在 GitHub 的参考下尝试过它,但不幸的是,它对我不起作用。我希望它能为其他人工作
0赞 tetar 9/19/2023
还有问题吗?想分享给我吗?@MiteshBaraiya
0赞 Mitesh Baraiya 9/19/2023
我通过将“unary_function”替换为“__unary_function”来解决它。@tetar
32赞 Ash 9/20/2023 #3

在源文件中修复此问题之前,最好的选择是在 podfile 中添加已删除的 libcpp 函数,如此处解决 https://github.com/facebook/react-native/issues/37748#issuecomment-1580589448

  post_install do |installer|
      installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
          config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION']
        end
      end
  end
74赞 Alaa Kanaan 9/20/2023 #4

enter image description here

就我而言,我在构建失败后遵循了 Xcode 的建议。我只需单击“修复”,现在一切正常。

我希望它能在下一次更新中得到修复。

评论

0赞 Mitesh Baraiya 11/22/2023
不知何故,当我按下修复按钮时,我的 Xcode 卡住了。之后,生成或运行菜单不起作用。我必须强制杀死Xcode,一旦我再次启动它,它就会显示相同的错误。
31赞 Green 9/22/2023 #5

运行后,我在终端中遇到了此错误。我通过以下步骤解决了它:npx react-native run-ios

  1. 打开 Xcode
  2. 单击播放图标以启动模拟器
  3. 模拟器将失败,但 Xcode 会在侧边栏中显示错误。单击错误以查看错误在代码中的位置。
  4. 点击“修复”按钮
  5. 做!现在模拟器将成功运行。

enter image description here

评论

0赞 Mitesh Baraiya 11/22/2023
当我按下修复按钮时,我的 Xcode 卡住了。之后,生成或运行菜单不起作用。我必须强制杀死Xcode,一旦我再次启动它,它就会显示相同的错误。
0赞 Green 11/27/2023
@MiteshBaraiya 看起来您在 Xcode 中手动编辑了代码行(根据您在下面发布的答案)。这可能就是为什么单击“修复”在您的情况下不起作用的原因?
0赞 Mitesh Baraiya 12/22/2023
不,它只发生在我按下修复按钮时。我不明白问题是什么,但我不得不推动并重新克隆项目来解决问题。
4赞 ABDULLAH 9/26/2023 #6

@Ash是对的,我将我的 Xcode 和 iOS 版本更新到 17.0 一切 工作正常,但是当我在 iOS 17 上运行它时,我遇到了这个错误。

No template named 'unary_function' in namespace 'std'; did you mean '__unary_function'

我按照提供的步骤修复它,应用程序开始运行。 但是,当我打开地图屏幕时,它崩溃了,该屏幕正在使用 react-native-maps。之后,我删除了 pod,重新安装了节点 模块,但同样的问题仍然存在。令人惊讶的是,当 我将以下代码添加到我的 Podfile 并重新安装了 pod, 应用程序开始正常工作,一切正常。 你必须同时解决这两个问题。

 post_install do |installer|
      installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
          config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION']
        end
      end
  end
1赞 Alex 9/28/2023 #7

对于任何遇到此错误的 React Native 用户,Facebook 已在 v0.72.5 中发布了修复程序 - 发行说明

XCode 15 修复(21763e85e3、0dbd621c59 和 8a5b2d6735)

npm update react-native

评论

0赞 erwstout 10/3/2023
即使在更新我的项目后仍然遇到同样的错误...... :-(
1赞 Dirk 10/9/2023 #8

如果您仍然有较旧的 RN 版本,

这对我有用:

post_install do |installer|
        react_native_post_install(installer)
        __apply_Xcode_12_5_M1_post_install_workaround(installer)
        
        installer.pods_project.build_configurations.each do |config|
            installer.pods_project.targets.each do |target|
                if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
                    config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
                end
            end
    
            # Set the preprocessing macro for the whole Pods project
            existing_flags = config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)']
            existing_flags << '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION'
            config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = existing_flags
        end
    end
1赞 Mihail 10/12/2023 #9

似乎还有另一种解决方法

https://github.com/facebook/react-native/issues/37748#issuecomment-1580334650

评论

0赞 Engr.Aftab Ufaq 10/16/2023
请在您的答案中添加详细信息。
1赞 alfC 11/18/2023 #10

如果可以控制编译标志,则有两种选择:

  1. 使 clang 重新启用已弃用的函数:-D_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION

  2. 防止 Boost 使用已弃用的功能:-DBOOST_NO_CXX98_FUNCTION_BASE

0赞 fatlinesofcode 12/6/2023 #11
sed -i '' 's/std::unary_function/__unary_function/g' ios/Pods/boost/boost/container_hash/hash.hpp

使用 grep 修复