Template-Klassen und enthalten Wächter in C ++

7

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 ...

    
Bill Kotsias 08.03.2010, 12:28
quelle

4 Antworten

8

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.

    
AProgrammer 08.03.2010, 12:32
quelle
12

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.

    
anon 08.03.2010 12:35
quelle
2

Kurze Antwort: Jede Einheit, die mehr als einmal mit Definitionen versehen werden soll, sollte eine Kopfzeile haben. Das ist mit oder ohne Vorlagen.

    
daramarak 08.03.2010 13:17
quelle
2

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.

    
quamrana 08.03.2010 13:33
quelle

Tags und Links