【发布时间】:2021-01-24 21:46:12
【问题描述】:
这是another question 的后续行动,已经解决。但是后来,我收到了这个错误:
error: no template named 'is_same_v' in namespace 'std'; did you mean 'is_same'?
!std::is_same_v<typename std::iterator_traits<T>::value_type, void>, O
~~~~~^~~~~~~~~
is_same
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/type_traits:831:61: note: 'is_same' declared here
template <class _Tp, class _Up> struct _LIBCPP_TEMPLATE_VIS is_same : public false_type {};
^
...它是在 C++14 中添加的,就像大多数其他类型特征
*_t版本一样...C++17 添加了*_v版本作为内联 constexpr 变量...
所以,is_same_v 是由 C++17 添加的。但我已经通过以下方式将 C++14 和 C++17 添加到 QMake:
CONFIG += c++14
CONFIG += c++17
QMAKE_CXXFLAGS += -std=c++14
QMAKE_CXXFLAGS += -std=c++17
XCode (Clang) 是否可能缺少某些 C++17 功能?我的 Xcode 版本是 9.4.1,我的 Clang++ 版本是:
$ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -v
Apple LLVM version 9.1.0 (clang-902.0.39.2)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
代码
代码中有 C++14 *_t 类型特征版本和 C++17 *_v 版本,来自具有许多贡献者的存储库:
template<class T, class O = T>
using IteratorOnly = std::enable_if_t<
!std::is_same_v<typename std::iterator_traits<T>::value_type, void>, O
>;
观察
当我在 QMake 项目文件中使用 CONFIG += c++14 时,我只收到此错误:
-
enable_if_t很好,is_same_v很糟糕
错误:命名空间“std”中没有名为“is_same_v”的模板;你是说'is_same'吗?
当我在 QMake 项目文件中使用 CONFIG += c++17 时,我收到以下两个错误:
-
enable_if_t和is_same_v都不好
错误:命名空间“std”中没有名为“enable_if_t”的模板;你是说'enable_if'吗?
错误:命名空间“std”中没有名为“is_same_v”的模板;你是说'is_same'吗?
为什么?
【问题讨论】:
-
C++14 和 C++17 标志是互斥的。您只能使用 single 标准版本进行编译。只需删除对 C++14 的所有引用。
-
@StoryTeller-UnslanderMonica 当我删除对 C++14 的所有引用并仅保留 C++17 时,我收到未知的
enable_if_t错误! -
听起来像是标准库/编译器的错误安装。
_t类型特征在 C++14 中可用。这意味着它们在 C++17 中也可用,因此指定不应使它们停止工作。 -
我认为 xcode 9 没有完整的 c++17 支持,您使用旧版本有什么原因吗?