错误:命名空间'std'中没有名为'remove_cv_t'的模板;你是指'remove_cv'吗?

175

我的问题似乎与此问题相似,只是出现在我运行Rails应用程序中的yarn install时。

当我运行yarn install时,它会成功运行一段时间,然后

../src/libsass/src/ast.hpp:1614:25: warning: loop variable 'numerator' of type 'const std::__1::basic_string<char>' creates a copy from type 'const std::__1::basic_string<char>' [-Wrange-loop-analysis]
        for (const auto numerator : numerators)
                        ^
../src/libsass/src/ast.hpp:1614:14: note: use reference type 'const std::__1::basic_string<char> &' to prevent copying
        for (const auto numerator : numerators)
             ^~~~~~~~~~~~~~~~~~~~~~
                        &
../src/libsass/src/ast.hpp:1616:25: warning: loop variable 'denominator' of type 'const std::__1::basic_string<char>' creates a copy from type 'const std::__1::basic_string<char>' [-Wrange-loop-analysis]
        for (const auto denominator : denominators)
                        ^
../src/libsass/src/ast.hpp:1616:14: note: use reference type 'const std::__1::basic_string<char> &' to prevent copying
        for (const auto denominator : denominators)
             ^~~~~~~~~~~~~~~~~~~~~~~~
                        &
2 warnings generated.
  rm -f Release/sass.a && ./gyp-mac-tool filter-libtool libtool  -static -o Release/sass.a Release/obj.target/libsass/src/libsass/src/ast.o Release/obj.target/libsass/src/libsass/src/ast_fwd_decl.o Release/obj.target/libsass/src/libsass/src/backtrace.o Release/obj.target/libsass/src/libsass/src/base64vlq.o Release/obj.target/libsass/src/libsass/src/bind.o Release/obj.target/libsass/src/libsass/src/cencode.o Release/obj.target/libsass/src/libsass/src/check_nesting.o Release/obj.target/libsass/src/libsass/src/color_maps.o Release/obj.target/libsass/src/libsass/src/constants.o Release/obj.target/libsass/src/libsass/src/context.o Release/obj.target/libsass/src/libsass/src/cssize.o Release/obj.target/libsass/src/libsass/src/emitter.o Release/obj.target/libsass/src/libsass/src/environment.o Release/obj.target/libsass/src/libsass/src/error_handling.o Release/obj.target/libsass/src/libsass/src/eval.o Release/obj.target/libsass/src/libsass/src/expand.o Release/obj.target/libsass/src/libsass/src/extend.o Release/obj.target/libsass/src/libsass/src/file.o Release/obj.target/libsass/src/libsass/src/functions.o Release/obj.target/libsass/src/libsass/src/inspect.o Release/obj.target/libsass/src/libsass/src/json.o Release/obj.target/libsass/src/libsass/src/lexer.o Release/obj.target/libsass/src/libsass/src/listize.o Release/obj.target/libsass/src/libsass/src/memory/SharedPtr.o Release/obj.target/libsass/src/libsass/src/node.o Release/obj.target/libsass/src/libsass/src/operators.o Release/obj.target/libsass/src/libsass/src/output.o Release/obj.target/libsass/src/libsass/src/parser.o Release/obj.target/libsass/src/libsass/src/plugins.o Release/obj.target/libsass/src/libsass/src/position.o Release/obj.target/libsass/src/libsass/src/prelexer.o Release/obj.target/libsass/src/libsass/src/remove_placeholders.o Release/obj.target/libsass/src/libsass/src/sass.o Release/obj.target/libsass/src/libsass/src/sass2scss.o Release/obj.target/libsass/src/libsass/src/sass_context.o Release/obj.target/libsass/src/libsass/src/sass_functions.o Release/obj.target/libsass/src/libsass/src/sass_util.o Release/obj.target/libsass/src/libsass/src/sass_values.o Release/obj.target/libsass/src/libsass/src/source_map.o Release/obj.target/libsass/src/libsass/src/subset_map.o Release/obj.target/libsass/src/libsass/src/to_c.o Release/obj.target/libsass/src/libsass/src/to_value.o Release/obj.target/libsass/src/libsass/src/units.o Release/obj.target/libsass/src/libsass/src/utf8_string.o Release/obj.target/libsass/src/libsass/src/util.o Release/obj.target/libsass/src/libsass/src/values.o
  c++ '-DNODE_GYP_MODULE_NAME=binding' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DBUILDING_NODE_EXTENSION' -I/Users/st/.node-gyp/16.0.0/include/node -I/Users/st/.node-gyp/16.0.0/src -I/Users/st/.node-gyp/16.0.0/deps/openssl/config -I/Users/st/.node-gyp/16.0.0/deps/openssl/openssl/include -I/Users/st/.node-gyp/16.0.0/deps/uv/include -I/Users/st/.node-gyp/16.0.0/deps/zlib -I/Users/st/.node-gyp/16.0.0/deps/v8/include -I../../nan -I../src/libsass/include  -O3 -gdwarf-2 -mmacosx-version-min=10.7 -arch x86_64 -Wall -Wendif-labels -W -Wno-unused-parameter -std=c++11 -stdlib=libc++ -fno-rtti -fno-exceptions -fno-strict-aliasing -MMD -MF ./Release/.deps/Release/obj.target/binding/src/binding.o.d.raw   -c -o Release/obj.target/binding/src/binding.o ../src/binding.cpp
In file included from ../src/binding.cpp:1:
In file included from ../../nan/nan.h:56:
In file included from /Users/st/.node-gyp/16.0.0/include/node/node.h:63:
In file included from /Users/st/.node-gyp/16.0.0/include/node/v8.h:30:
/Users/st/.node-gyp/16.0.0/include/node/v8-internal.h:452:38: error: no template named 'remove_cv_t' in namespace 'std'; did you mean 'remove_cv'?
            !std::is_same<Data, std::remove_cv_t<T>>::value>::Perform(data);
                                ~~~~~^~~~~~~~~~~
                                     remove_cv
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/type_traits:697:50: note: 'remove_cv' declared here
template <class _Tp> struct _LIBCPP_TEMPLATE_VIS remove_cv
                                                 ^
1 error generated.
make: *** [Release/obj.target/binding/src/binding.o] Error 1
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/Users/st/rails/myapp/node_modules/node-gyp/lib/build.js:262:23)
gyp ERR! stack     at ChildProcess.emit (node:events:365:28)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (node:internal/child_process:290:12)
gyp ERR! System Darwin 20.3.0
gyp ERR! command "/usr/local/Cellar/node/16.0.0/bin/node" "/Users/st/rails/myapp/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="
gyp ERR! cwd /Users/st/rails/myapp/node_modules/node-sass
gyp ERR! node -v v16.0.0
gyp ERR! node-gyp -v v3.8.0
gyp ERR! not ok 

有什么办法可以解决这个问题吗?(我甚至不确定它是xcode/node/rails/c++的问题)

其他注意事项

  • /usr/bin/xcodebuild -version 返回
Xcode 12.4
Build version 12D4e
  • cpp --version 返回
Apple clang version 12.0.0 (clang-1200.0.32.29)
Target: x86_64-apple-darwin20.3.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

请注意:我不会用cpp编程,因此我对如何解决问题几乎没有任何背景知识。

15个回答

186
更新:自从node-sass版本6.0.1起,支持Node 16。将node-sass更新到6.x系列的版本可以解决Node 16的问题。对于其他Node版本,node-sass readme中有一个兼容性表格,显示了哪些版本的Node SASS与哪些版本的Node兼容。
你所看到的是在编译node-sass时出现的错误。这是一个处理Sass/SCSS样式的包,它是用C++编写的,只是作为JavaScript库重新打包。由于它是用C++编写的,所以在安装过程中需要在您的设备上进行编译(这是由一个名为node-gyp的工具在内部完成的,您也可以在错误输出中看到它)。
问题在于截至撰写本答案时,node-sass不支持Node 16,请参阅跟踪问题:https://github.com/sass/node-sass/issues/3077 目前还没有估计它何时会支持(这是公平的,因为这是一个由志愿者驱动的项目)。即使您成功在Node 16上安装了node-sass,我建议不要这样做,因为行为可能是未定义的。

正确的解决方案是将您的 Node 安装降级为支持的版本(我可以看到他们的 CI 中测试了 14 和 15)。如果你从 Git 克隆了一个项目,但它无法在你的机器上安装,而在你的同事或生产服务器上可以工作,那很可能该项目也使用了不同版本的 Node,并且未经过 Node 16 的测试,所以我建议你不要在 Node 16 上进行开发。如果该项目在几天前还能正常工作,但现在却无法正常工作,很可能是你最近升级了系统设置(例如 Homebrew),这将把你升级到 Node 16(这就是我遇到此问题并找到的方法)。

你应该与项目的作者确认生产服务器上运行的 Node 版本,并在本地安装相同的版本。作为一项最佳实践,在将来,保持生产版本和本地版本的 Node (以及 yarn 或 npm)同步。要管理多个 Node 版本,您可以使用这个工具 https://github.com/nvm-sh/nvm


7
当我尝试运行 yarn upgrade node-sass 时仍然出现错误。我不得不运行 yarn remove node-sassyarn add node-sass@6.0.1 才能解决它。谢谢! - Michael Schober
yarn upgrade node-sass 失败了,似乎是因为它想在 yarn 实际升级 node-sass 之前构建资产。Michael Schober 的说明对我也没有用,希望有人能尽快发布正确的升级方法。 - wbharding
3
我讨厌node-sass。 - Olle Härstedt
1
令人难以置信的是,在2022年,CSS可以让成熟的Web应用程序崩溃。 - duhaime
这是一个依赖性问题。我不明白为什么Node的软件包管理器经常在解析依赖关系时失败。它们甚至都没有意识到这个问题。它们只是把所有东西都倒在日志里,而这显然是给软件包维护者看的。我们最后不得不在从发明轮子开始的一大堆日志中挖掘错误消息。 - undefined

117

更新 - 简单修复!

以下是一种简单的方法,可以解决这个问题,并且您可以继续使用node 16。

  1. 删除 yarn.lock
  2. 打开 package.json 并确保您使用 webpacker 版本为 5.4.3(最新版本 - 它不会调用导致此问题的旧版 node-sass)
  3. 运行 yarn install
  4. 启动Rails服务器,一切都应该回到正常状态!

以下是以前的、更长的解答(如果仍然有用):

node-sass尚未与node v16兼容

为了避免这种情况,降级node(例如到14版),直到node-sass与v16兼容。 使用nvm降级节点,只需运行:

nvm install 14

运行以下命令,全局设置版本14(使每个新终端窗口的默认节点版本为14):running:

运行该命令:

 nvm alias default 14 
nvm alias default 14

现在你已经安装了Node 14并将其设置为默认版本!..现在你只需要让你的应用程序使用v14。


如何让Rails应用程序使用Node 14

安装Node 14(请参见上文)。打开终端并前往您的应用程序根目录,然后执行以下操作:

  1. 如果Rails服务器正在运行,请停止它
  2. 打开一个全新的终端窗口(以便node --version返回14.x而不是 16)
  3. 运行spring stop
  4. 删除yarn.lock
  5. 使用rm -rf node_modules删除现有的节点模块
  6. 检查node --version是否返回14。如果没有,请重新运行nvm install 14
  7. 现在使用yarn install重新安装模块(如果您没有用于Node 14的yarn,请使用npm install --global yarn进行安装)
  8. 应该成功!
  9. 重新启动Rails服务器,它将工作!

如果您在Heroku上遇到此问题,请确保Webpacker已更新

yarn upgrade @rails/webpacker --latest

3
你救了我的命。这是唯一有效的解决方案。非常感谢你!! - Reinier Garcia
感谢您的帮助!为什么我们在第6步再次检查版本? - sekmo
@sekmo 这只是双重检查,因为安装多个不同版本并且迷失跟踪很容易,但对于任何有经验的 nvm 用户来说,第6步最终只是一个检查,因此是不必要的,可以跳过。 - stevec
另一个可能有用的解决方案在这里 - stevec

84

有同样的问题,这个方法对我有效:

CXXFLAGS="--std=c++17" yarn install

3
你能否添加一份解释,说明是什么导致了这个问题? - hadaytullah
1
当然,那些正在使用的人会做类似的事情。CXXFLAGS="--std=c++17" npm i - Shreshth

42

39

试试这个:

export CXXFLAGS="--std=c++17" && npm install

14

在构建node-sass时,我遇到了这个错误。

/Users/shahwarkhalid/.node-gyp/16.6.1/include/node/v8-internal.h:488:38: error: no template named 'remove_cv_t' in namespace 'std'; did you mean 'remove_cv'?

使用以下方法解决了我的问题:

cd /Users/shahwarkhalid/.node-gyp/16.6.1/include/node/

在编辑器中打开v8-internal.h文件。

在第488行将remove_cv_t更改为remove_cv

再次运行yarn install,问题得到解决。


1
虽然这可能会解决问题,但你可能会破坏其他所有东西。如果选择这条路线,我建议在成功运行 yarn install 后至少将文件恢复到原始状态。在我的情况下,@Ulises 的答案起了作用:https://dev59.com/A-k5XIcBkEYKwwoY2NPu#70086482 - Óscar Gómez Alcañiz

10
自从回答这个问题以来,node-sass的一个新版本(v6)已经发布,通过添加对 node 16 的支持解决了这个问题。
在我的情况下,Rails依赖于一个旧版的node-sass,因为我在package.json中使用的@rails/webpacker版本是4.3.0。将其更新到此回答时的当前版本之后的版本5.4.0可以解决这个问题。

更改此版本后,除了 $ yarn upgrade 解决了我的问题。 - ddavison
1
像建议的那样,yarn upgrade @rails/webpacker@5.4.0 对我有用。 - Masa Sakano

8

我也遇到了Node 16的同样问题。将其降级到Node 14对我来说很有效。以下是简单的步骤,说明如何执行此操作(使用Homebrew):

  • Check your current node version

    node -v 
    
  • Check for available node versions

    brew search node
    
  • To unlink from current version

    brew unlink node
    
  • Install the version you want using the following command (e.g. for version 14)

    brew install node@14
    
  • Link it to the installed version

    brew link node@14
    

最后,请确保您使用第一步中的命令安装了正确的版本。


brew link --overwrite node@14 - Elinaldo Monteiro

7

和@murb一样,我在构建盒子上运行了brew update,发现安装了node 16。将其降级到node 12可以为我解决问题,直到我可以更新整个构建系统以与较新版本的node正常工作。


你能描述一下你遵循的降级步骤吗? - Ted Stresen-Reuter

7

I tried to see my current version with cpp --version which gives

cpp --version Apple clang version 12.0.0 (clang-1200.0.32.29)
Target: x86_64-apple-darwin20.3.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
编译器版本并不等同于C++标准版本。
前者是工具的版本,后者是C++标准的版本。
所有主要的最新C++编译器(据我所知)都支持多个C++标准。
C++标准对于开发可移植的代码非常重要 - 无关于具体编译器。这样可以为多个平台开发代码,由不同的编译器进行编译。它还有助于以更高质量进行开发-在一个供应商的编译器中可能会被容忍的代码弱点,在另一个编译器中可能会得到抱怨。
编译器中显式选择C++标准也很重要:
最新支持的编译器标准可能仍处于试验阶段。
开发人员可能根据某个(较旧的)标准进行开发(以保持与其他平台的兼容性,在这些平台上最新的C++标准尚未得到可用编译器的支持),并希望确保没有新的东西插进来。
具有特定编译器版本的编译器通常默认使用某个C++标准。(可以在文档或在线找到它是哪个。)然而,这并不一定是最新支持的C++标准。
可以通过命令行参数显式选择C++标准:
- g++和clang:-std=(可能也适用于其他供应商的编译器) - MSVC:/std:
例如,g++ -std=c++14 强制调用 G++ 的 C++14 标准。
有点遗憾的是,这个命令行参数不是每个编译器/供应商都完全相同。因此,在使用的构建工具中定义所需的C++标准更为方便。(构建工具会根据找到/使用的编译器选择适当的命令行参数。)
对于我在日常工作中使用的 CMake:
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

(对于边缘情况,可能需要额外的设置,正如我曾经痛苦地发现的一样:SO:指向静态成员的成员指针。)
OP使用了我承认之前从未听说过的yarn
他报告说yarn install -std=c++17解决了他的问题。(我试图在网上找到这方面的文档,但是失败了。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接