【问题标题】:Multiple standard headers with same name - which one gets included and how can I change it?多个具有相同名称的标准标题 - 包含哪一个以及如何更改它?
【发布时间】:2019-05-26 15:15:45
【问题描述】:

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

【问题讨论】:

  • gcc 有一个标准搜索地点列表。您可以使用 -v (IIRC) 编译器标志打印列表。默认情况下,.../tr1 或 .../tr2 不太可能在该列表中。也许你已经用-I添加了这些目录?
  • 您还可以通过提供 -H 编译器标志来打印实际上包含的文件的名称(带有完整路径)。

标签: c++11 gcc arm


【解决方案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 选项,也许还有配置 您的实施选项。

【讨论】:

  • 我猜这更有意义。让我感到困惑的是,我正在将一个项目从 IAR 转移到 gcc。两者都在尝试使用 c++11,但不知何故,IAR 似乎加入了一些额外的 c++14 功能(如 enable_if_t)。这很令人困惑和烦人。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多