Was bedeutet es, dass der Compiler eine zweiphasige Suche verwendet, um die Vorlagenklasse zu kompilieren?
Was bedeutet es, dass der Compiler eine zweiphasige Suche verwendet, um die Vorlagenklasse zu kompilieren?
Antworten:
Vorlagen werden (mindestens) zweimal kompiliert:
Ohne Instanziierung wird der Vorlagencode selbst auf Syntax überprüft.
ZB: Alle Syntaxfehler wie ;etc.
Zum Zeitpunkt der Instanziierung (wenn der genaue Typ bekannt ist) wird der Vorlagencode erneut überprüft, um sicherzustellen, dass alle Aufrufe für diesen bestimmten Typ gültig sind.
Beispiel: Die Vorlage ruft möglicherweise Funktionen auf, die für diesen bestimmten Typ möglicherweise nicht vorhanden sind.
Dies wird als Zwei-Phasen-Suche bezeichnet.
sqrt(1), sqrtdiese deklariert werden muss, bevor die Vorlage definiert wird. Wenn Sie jedoch aufrufen sqrt(t), wo tsich eine Instanz eines Typs befindet, der ein Vorlagenparameter ist, sqrtmuss sie erst sichtbar sein, wenn die Vorlage instanziiert wurde. MSVC hat das früher nicht richtig gemacht: immer noch nicht, soweit ich weiß.
template <class T> class C { put really anything here & ~ - (but nothing unbalanced and no 8-bit char outside string literal) }akzeptiert, wenn er Cniemals instanziiert wurde! Das war vor mehr als einem Jahrzehnt.
::sqrt(::NS::A)nicht gefunden wird, da die zusätzliche Suche in ::NSund nicht in erfolgt ::. Der letzte Punkt ist, dass der Bereich eines Alias, typedef oder using, nicht durchsucht wird, sondern nur der Bereich des alised-Typs selbst.