Несколько стандартных заголовков с одинаковым именем - какой из них включается и как его изменить? - PullRequest
0 голосов
/ 29 декабря 2018

Я получаю ошибку, что 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

1 Ответ

0 голосов
/ 31 декабря 2018

По вашим тегам вы компилируете с -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, и, возможно, параметров конфигурации вашей реализации.

...