Ich muss mit einer Bibliothek umgehen, die aus vielen Vorlagen besteht, die natürlich alle in Header-Dateien implementiert sind. Jetzt versuche ich einen Weg zu finden, die unerträglich langen Kompilierzeiten zu reduzieren, die dadurch entstehen, dass ich die gesamte Bibliothek in jede meiner Kompilationseinheiten aufnehmen muss.Vorlagen: Verwenden Sie Vorwärtsdeklarationen, um die Kompilierzeit zu reduzieren?
Verwenden Forward-Deklarationen eine Möglichkeit, trotz der Vorlagen? Ich versuche etwas in der Richtung des Beispiels unten, wo ich versuchte, um die #include <vector>
als Beispiel zu kommen, aber es gibt mir einen Linker-Fehler, weil push_back
nicht definiert ist.
#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
Ich habe einmal versucht, vorkompilierte Header aber, dass die Kompilierung mal überhaupt nicht (ich sicher, dass sie in der Tat statt der realen Header geladen wurden machte) ändern. Aber wenn Sie alle sagen, dass vorkompilierte Header der Weg sein sollten, dann versuche ich es noch einmal.
UPDATE: Einige Leute sagen, dass es nicht wert ist, die STL-Klassen weiterzuleiten. Ich sollte betonen, dass die obige STL vector
nur ein Beispiel war. Ich versuche nicht wirklich, STL-Klassen weiterzuleiten, aber es geht um andere, stark templatete Klassen einer Bibliothek, die ich verwenden muss.
UPDATE 2: Gibt es eine Möglichkeit, das obige Beispiel richtig zu kompilieren und zu verknüpfen? Logan schlägt vor, -fno-implicit-templates
und template class std::vector<int>
irgendwo zu verwenden, vermutlich in eine separate Datei, die mit -fno-implicit-templates
kompiliert wird, aber ich bekomme immer noch Linker-Fehler. Ich versuche wieder zu verstehen, wie es für std::vector
funktioniert, so dass ich es dann auf die Vorlagenklassen anwenden kann, die ich tatsächlich verwende.
in Ihrem Beispiel haben Sie nicht nach vorne nichts erklärt. Sie haben lediglich eine Vorlagenklasse namens vector in namespace std erstellt. Dann haben Sie die von Ihnen angegebene push_back-Methode nicht definiert. Daher der Linkerfehler. –
Second Evans Erklärung, warum Vorwärts-Deklaration std :: vector nicht funktioniert (Sie vermissen mindestens ein Argument in den spitzen Klammern). Verwenden Sie eine von Ihnen selbst geschriebene Vorlagenklasse, von der Sie wissen, dass sie keine Standardvorlagenargumente enthält. –