Мне приходится иметь дело с библиотекой, состоящей из многих шаблонов, которые, конечно же, реализованы в файлах заголовков. Теперь я пытаюсь найти способ уменьшить невыносимо длинные сроки компиляции, которые исходят из того факта, что я в значительной степени должен включать всю библиотеку в каждую и одну из моих единиц компиляции.
Является ли использование форвардных объявлений возможностью, несмотря на шаблоны? Я пытаюсь сделать что-то в соответствии с приведенным ниже примером, где я попытался обойти #include <vector>
в качестве примера, но он дал мне ошибку компоновщика, потому что push_back
- undefined.
#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, но это касается других, сильно шаблонных классов некоторой библиотеки, которые я должен использовать.
ОБНОВЛЕНИЕ 2: Есть ли способ сделать вышеприведенный пример собственно компилировать и правильно связывать? Логан предлагает использовать -fno-implicit-templates
и помещать template class std::vector<int>
где-то, предположительно в отдельный файл .cpp
, который скомпилируется с помощью -fno-implicit-templates
, но я все еще получаю ошибки компоновщика. Опять же, я пытаюсь понять, как это работает для std::vector
, чтобы затем применить его к темплатированным классам, которые я фактически использую.