c++11 - 多个具有相同名称的标准标头 - 包含哪一个以及如何更改它?
问题描述
我收到一个std::enable_if_t
没有命名模板类型的错误。有趣的是,它包含#include <type_traits>
在文件顶部的一行中。但是查看其他一些标准头文件,在不同的目录中有另一个名为 type_traits 的文件,它没有定义enable_if_t
. gcc 如何决定使用哪些文件以及如何更改它?
我要使用的文件的路径是:
.../arm-none-eabi/include/c++/7.3.1/type_traits
我不知道 gcc 正在使用什么文件,但这些文件没有应该解决我的问题的定义:
.../arm-none-eabi/include/c++/7.3.1/bits/cpp_type_traits.h
.../arm-none-eabi/include/c++/7.3.1/ext/type_traits.h
.../arm-none-eabi/include/c++/7.3.1/experimental/type_traits
.../arm-none-eabi/include/c++/7.3.1/tr2/type_traits
.../arm-none-eabi/include/c++/7.3.1/tr1/type_traits
解决方案
根据您的标签,您正在使用-std=c++11
. C++11 标准库没有定义std::enable_if_t
. C++14 定义了它,标准库头文件只有在你使用-std=c++14
.
在 C++11 中,写std::enable_if<B,T>::type
而不是std::enable_if_t<B,T>
. C++14 定义:
template< bool B, class T = void >
using enable_if_t = typename enable_if<B,T>::type;
C++11 没有。
您不能简单地通过在某些标准头文件中找到X的声明或定义来推断该声明或定义对于具有给定编译选项的编译器是可见的,因为头文件将被预处理,通常会导致编译不同的部分,具体取决于编译选项,包括-std
选项,也许还有你实现的配置选项。
推荐阅读
- java - Linux redirected output not print to the end but the middle of file
- c# - EF Core 3.0,日期时间时区问题 C#
- javascript - 如何解决 html/js 计算器不是数字 (NaN) 错误?
- sql - 这可以用 JOIN 而不是嵌套查询重写吗?
- android - 无法从数据 Uri 加载图像
- java - Spring Boot Mongo中查找表的条件条件
- node.js - SQL Server 日志:错误 18456,严重性:14,状态:8 和 Visual Studio 终端:未定义
- r - 在 rmarkdown 中预览表格
- c# - IHostedService 多个实现的最佳实践
- typescript - 自定义类的类型转换