Я пытаюсь добавить в проект extern template
, чтобы ускорить время сборки и уменьшить размер диска на диске во время сборки.
Я сделал это, перечисляя специализации, которые я часто использую, например.
extern template class std::vector<std::string>;
extern template class std::vector<unsigned int>;
extern template class std::vector<uint32_t>;
extern template class std::vector<size_t>;
Проблема в том, что unsigned int
есть size_t
, может быть, и uint32_t
есть unsigned int
, может быть. Таким образом, в зависимости от цели сборки компиляция не подходит для разнообразия списка "не extern
", которая фактически создает специализации:
template class std::vector<std::string>;
template class std::vector<unsigned int>;
template class std::vector<uint32_t>;
template class std::vector<size_t>;
Ошибка выглядит так (строка и номер столбца неточно):
templates-impl.h:15:36: error: duplicate explicit instantiation of ‘class std::vector<long unsigned int>’ [-fpermissive]
template class std::vector<size_t>;
Моя цель состоит в том, чтобы просто указать типы, которые я использую, как я их использую, с минимумом суеты и без необходимости жесткого кодирования вариантов списка для разных целей.
Я предполагаю, что в С++ 14 я мог бы решить это с помощью if constexpr
и некоторых std::is_same
, по крайней мере, если бы это было разрешено в области пространства имен.
Как я могу сделать это в С++ 11?