Ist es ratsam, Wächter um Vorlagenklassen einzuschließen?
Werden Vorlagenklassen nicht jedesmal neu repariert, wenn Sie sie mit einer anderen Implementierung referenzieren?
N. B In Visual C ++ 2008 erhalte ich keine Fehler, die die zwei kombinieren ...
Vorlagen-Definitionen sollen einmal geparst werden (und Dinge wie die Namenssuche mit zwei Phasen sind hier, so dass so viele Fehler wie möglich sofort ohne eine Instanziierung gegeben werden können). Instanziierungen werden mit der zu diesem Zeitpunkt erstellten internen Datenstruktur durchgeführt.
Vorlagen-Definitionen sind normalerweise (d. h. wenn Sie export
nicht verwenden oder etwas Spezielles tun) in Header-Dateien, die ihren include guard haben sollten. Einen für die Definition von Vorlagen hinzuzufügen ist nutzlos, aber nicht schädlich.
Sie brauchen Wächter. Betrachten Sie diesen Code:
%Vor%Dies ergibt den Fehler:
%Vor%Außerdem enthalten die Header, die Vorlagen enthalten, routinemäßig auch Nicht-Template-Code.
Um Ihre erste Frage zu beantworten: Ja, es ist klug und obligatorisch, Wächter um Schablonenklassen einzuschließen. Oder strengere den gesamten Inhalt jeder Header-Datei.
Dies ist der Weg, der One Definition Rule zu folgen, wenn Sie Zeug in Header-Dateien haben, so dass es herum geteilt und immer noch sicher ist. Es kann andere Header-Dateien geben, die deins enthalten. Wenn der Compiler eine Moduldatei kompiliert, sieht er möglicherweise eine #include
Ihrer Header-Datei viele Male, aber die Wächter treten zu der zweiten und nachfolgenden Zeiten ein, um sicherzustellen, dass der Compiler den Inhalt nur einmal sieht.
Es spielt keine Rolle, dass der Compiler alles neu analysiert; das ist seine Aufgabe. Sie müssen nur einmal den Inhalt liefern und dann hat der Compiler es gesehen und kann sich so oft wie nötig darauf beziehen.
Tags und Links c++ templates include-guards