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

回答 10 浏览 2.3万 2023-09-19

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

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

这一行出现故障:

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

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

Mitesh Baraiya 提问于2023-09-19
10 个回答
#1楼 已采纳
得票数 62

enter image description here

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

我希望它能在接下来的更新中得到修复。

Alaa Kanaan 提问于2023-09-20
不知怎的,当我按下修复按钮时,我的 Xcode 就卡住了。此后构建或运行菜单将不起作用。我必须强制终止 Xcode,一旦我再次启动它,它就会显示相同的错误。Mitesh Baraiya 2023-11-22
#2楼
得票数 29

在源文件中修复此问题之前,最好的选择是在 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
Ash 提问于2023-09-19
#3楼
得票数 26

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

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

enter image description here

Green 提问于2023-09-21
Green 修改于2023-09-27
当我按下修复按钮时,我的 Xcode 卡住了。此后构建或运行菜单将不起作用。我必须强制终止 Xcode,一旦我再次启动它,它就会显示相同的错误。Mitesh Baraiya 2023-11-22
@MiteshBaraiya 看起来您在 Xcode 中手动编辑了代码行(根据您在下面发布的答案)。这可能就是为什么单击“修复”在您的情况下不起作用的原因?Green 2023-11-26
#4楼
得票数 15

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

所以实际的线路是..

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

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

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

解决方法

选择 Pod > Build Settings > 在“Apple Clang - Preprocessing”部分>“Macro”部分下

 preview add line

在 release & debug 添加 -> _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION

ps:要添加此内容,只需单击该列,然后单击底部的“+”->然后粘贴:_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION “预览添加行”/

tetar 提问于2023-09-19
tetar 修改于2023-09-19
我之前根据 GitHub 的参考尝试过,但不幸的是,它对我不起作用。我希望它对其他人有用Mitesh Baraiya 2023-09-19
还有问题吗?想分享给我吗? @MiteshBaraiyatetar 2023-09-19
我通过将 'unary_function' 替换为 '__unary_function' 解决了这个问题。 @tetarMitesh Baraiya 2023-09-19
#6楼
得票数 4

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

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

我按照提供的步骤修复它,应用程序开始运行。但是,当我打开正在使用的react-native-maps 时,它崩溃了。之后我删除了pod,重新安装了node 模块,但同样的问题仍然存在。令人惊讶的是,当我在 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
ABDULLAH 提问于2023-09-26
#7楼
得票数 1

如果您还有旧的 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
Dirk 提问于2023-10-09
#8楼
得票数 1
Mihail 提问于2023-10-11
请在您的答案中添加详细信息。Engr.Aftab Ufaq 2023-10-16
#9楼
得票数 1

如果您可以控制编译标志,您有两个选择,

  1. 让 clang 重新启用已弃用的功能:-D_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION

  2. 防止 Boost 使用已弃用的函数:-DBOOST_NO_CXX98_FUNCTION_BASE

alfC 提问于2023-11-17
#10楼
得票数 0

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

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

npm update react-native

Alex 提问于2023-09-27
即使更新我的项目后仍然遇到同样的错误...:-(erwstout 2023-10-02