2010-03-08 18 views
7

Ist es ratsam, Wächter um Vorlagenklassen einzuschließen?Vorlagenklassen und enthalten Wächter in C++

Werden Vorlagenklassen nicht jedes Mal neu übersetzt, wenn Sie sie mit einer anderen Implementierung referenzieren?

NB In Visual C++ 2008 bekomme ich keine Fehler kombiniert die beiden ...

Antwort

8

Vorlagen Definitionen sollen einmal analysiert werden (und Dinge wie zwei Lookup-Phasen Namen sind hier so, dass so viel Fehler wie möglich sein kann sofort gegeben, ohne eine Instantiierung zu haben). Instanziierungen werden mit der zu diesem Zeitpunkt erstellten internen Datenstruktur durchgeführt.

Templates Definitionen sind in der Regel (d. H., Wenn Sie nicht export oder etwas besonderes tun) in Header-Dateien, die ihre Include-Guard haben sollten. Einen für die Definition von Vorlagen hinzuzufügen, ist nutzlos, aber nicht schädlich.

+5

Fügen Sie hinzufügen, Wachen immer, sich daran zu gewöhnen, wie es eine gute Praxis ist. – Poni

+1

Wenn Sie eine Entwicklung auf Win32 durchführen, fügen Sie "#pragma once" ein, wenn Sie Wächter verwenden. – KitsuneYMG

+0

+1 für die Angabe, dass Instanziierungen mit der internen Datenstruktur zum Zeitpunkt der ersten Sweep erstellt – Otuken

12

Sie benötigen Schutzvorrichtungen. Betrachten Sie diesen Code:

// this is t.h 
template <typename T> 
void f(T t) { 
} 

// this is t.cpp 
#include "t.h" 
#include "t.h" 

int main() { 
    f(1); 
} 

Dies gibt den Fehler:

t.h:2: error: redefinition of 'template<class T> void f(T)' 
t.h:2: error: 'template<class T> void f(T)' previously declared here 

Auch die Header, die Vorlagen enthalten routinemäßig auch Nicht-Template-Code enthalten.

+2

Streng genommen ist das eine Vorlage Funktion und nicht eine Vorlage-Klasse, aber das Prinzip ist das gleiche - Sie erhalten einen Fehler mit mehreren Definitionen, wenn Sie die erklären gleiche Klasse zweimal, Vorlage oder nicht. –

+0

Siehe meine Antwort hier - http://stackoverflow.com/questions/22595015/c-class-template-undefined-reference-to-function/26816994#26816994 – v010dya

2

Kurze Antwort: Jede Einheit, die mehrere Definitionen enthalten soll, sollte eine Kopfzeile haben. Das ist mit oder ohne Vorlagen.

2

Um Ihre erste Frage zu beantworten: Ja, es ist klug und obligatorisch, Wächter um Vorlagenklassen einzuschließen. Oder strengere den gesamten Inhalt jeder Header-Datei.

Dies ist die Art und Weise, die One Definition Regel zu befolgen, 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, kann es eine #include Ihrer Header-Datei viele Male sehen, aber die Wachen 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 bereitstellen und dann hat der Compiler es gesehen und kann sich so oft wie nötig darauf beziehen.