Мне нужно иметь дело с библиотекой, которая состоит из множества шаблонов, которые, конечно же, реализованы в файлах заголовков. Теперь я пытаюсь найти способ уменьшить невыносимо длинные сроки компиляции, которые исходят из того факта, что я в значительной степени должен включать всю библиотеку в каждую и одну из моих единиц компиляции.Шаблоны: использовать форвардные объявления, чтобы сократить время компиляции?
Является ли использование форвардных объявлений возможностью, несмотря на шаблоны? Я пытаюсь что-то сделать в соответствии с приведенным ниже примером, где я попытался обойти #include <vector>
, в качестве примера, но он дает мне ошибку компоновщика, потому что push_back
не определен.
#include <iostream>
namespace std {
template<class T>
class vector {
public:
void push_back(const T& t);
};
}
int main(int argc, char** argv) {
std::vector<int>* vec = new std::vector<int>();
vec->push_back(3);
delete vec;
return EXIT_SUCCESS;
}
$ g++ fwddecl.cpp
ccuqbCmp.o(.text+0x140): In function `main':
: undefined reference to `std::vector<int>::push_back(int const&)'
collect2: ld returned 1 exit status
Я попытался скомпилированные заголовки один раз, но это не меняет времена компиляции на всех (я убедиться, что они действительно были загружены вместо реальных заголовков). Но если вы все скажете, что прекомпилированные заголовки должны быть для вас, я попробую еще раз.
ОБНОВЛЕНИЕ: Некоторые люди говорят, что не стоит пересылать объявления класса STL. Я должен подчеркнуть, что STL vector
, приведенный выше, был просто примером. Я не пытаюсь переслать классы STL, но это касается других, сильно шаблонных классов некоторой библиотеки, которые я должен использовать.
UPDATE 2: Есть ли способ сделать пример, на самом деле, собственно компилировать и правильно связывать? Логан предлагает использовать -fno-implicit-templates
и поставить template class std::vector<int>
где-то, предположительно в отдельный файл .cpp
, который скомпилируется с -fno-implicit-templates
, но у меня все еще возникают ошибки компоновщика. Опять же, я пытаюсь понять, как это работает для std::vector
, поэтому я могу применить его к темплатированным классам, которые я фактически использую.
в вашем примере, вы не вперед объявили ничего. Все, что вы сделали, это создать шаблонный шаблон с именем vector в пространстве имен std. Тогда вам не удалось определить метод push_back, который вы указали в нем. Следовательно, ошибка компоновщика. –
Второе объяснение Эвана о том, почему forward decl объявление std :: vector не работает (вам не хватает хотя бы одного аргумента внутри угловых скобок). Попробуйте использовать класс шаблонов, который вы написали сами, что, как вы знаете, не имеет аргументов шаблона по умолчанию. –