首页 > 解决方案 > 多个具有相同名称的标准标头 - 包含哪一个以及如何更改它?

问题描述

我收到一个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

标签: c++11gccarm

解决方案


根据您的标签,您正在使用-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 没有。

文档std::enable_if

您不能简单地通过在某些标准头文件中找到X的声明或定义来推断该声明或定义对于具有给定编译选项的编译器是可见的,因为头文件将被预处理,通常会导致编译不同的部分,具体取决于编译选项,包括-std选项,也许还有你实现的配置选项。


推荐阅读