class-template-Instantiierung
Gerade lese ich den wiki-Artikel über CRTP, und ich bin ein wenig verwirrt über die template-Instantiierung.
Laut wiki,
member-Funktion stellen (Definitionen) sind nicht instanziiert, bis lange
nach Ihren Erklärungen.
Ich verstehe nicht ganz, was es bedeutet.
Angenommen ich habe eine Klasse Vorlage:
template <typename T>
class A
{
public:
void foo(T t)
{
//...
};
};
Wenn ich die Klasse instanziieren template Ein, oder tut es das instanziieren der member-Funktion foo()?
Beispiel:
//in .cpp file
int main()
{
A<int> a; //question 1
//class template is instantiated here, isn't it?
//What about foo(), is it instantiated too?
a.foo(10); //question 2
//according to the quotation, foo() will not be instantiated until it is used.
//if so, foo() is instantiated right here, not in question 1, right?
}
- Stecker: Dieser kann Ihre Fragen beantworten: stackoverflow.com/questions/7182359/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheinen Sie zu verwirren, eine Sache:
Instanziierung geschieht während Zusammenstellung, nicht während der Laufzeit. Daher können Sie nicht sagen, "auf die Zeile" eine Vorlage-Klasse oder eine Funktion Vorlage instanziiert wurde.
Sagte, du hast Recht über die Tatsache, dass die Funktion Vorlagen sind nicht instanziiert, gemeinsam mit der Klasse Vorlagen.
Konnten Sie beobachten es in einem solchen Fall: haben Sie die folgenden Dateien
Dann während der Kompilierung a.cpp nur würde instanziiert werden. Jedoch, während der Kompilierung b.cpp beide würden instanziiert werden.
Da dieses, im Fall A::foo, enthielt einige semantisch Ungültiger code für eine gegebene Menge von template-Parametern, die Sie erhalten würden, kompilieren Sie Fehler in b.cpp aber nicht a.cpp.
Ich hoffe das klärt die Sache!
Mit Klassen-templates, die Faustregel ist, dass nur die Mitglieder sind instanziiert, die auch tatsächlich verwendet werden.
Wenn Sie wollen abschließen der Instanziierung der C++ bietet explizite Instantiierung (allerdings in der Regel nicht; die Tatsache, dass nicht jedes bit ist komplett instanziert bedeutet, dass Sie Ihre template-Klasse ist sogar noch generischer als es senkt die Anforderungen an
T
beachten Sie, dass die syntax-Prüfung und Abgleich der nicht-abhängigen Arten (Zeug, das ist nicht abhängig vonT
) immer noch passiert).Finden Sie eine vollständige Antwort hier: Template-Instantiierung details des GCC und MS-Compiler