具有相同名称的多个标准标头-包含哪个标头,我该如何更改?

时间:2018-12-28 21:43:26

标签: c++11 gcc arm

我收到一个错误,提示std::enable_if_t没有命名模板类型。有趣的是,它包含在文件顶部的行#include <type_traits>中。但是查看其他一些标准标头,在另一个未定义enable_if_t的目录中还有一个名为type_traits的文件。 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

1 个答案:

答案 0 :(得分:1)

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

请参见documentation of std::enable_if

您不能仅通过在其中找到 X 的声明或定义来推断 一些标准的标头,该声明或定义将可见 给定编译选项的编译器,因为头文件将 进行预处理,通常取决于 编译选项,包括-std选项,也许还有配置 您的实施选项。