Im Allgemeinen C++ typename
muss wegen der unglücklichen Syntax [*] es erbt von C, die es unmöglich, ohne nicht-lokalen Informationen machen zu sagen - zum Beispiel - in A * B;
ob A
Namen einen Typ (in der Fall ist dies eine Deklaration von B
als Zeiger darauf) oder nicht (in diesem Fall ist dies ein Multiplikationsausdruck - durchaus möglich, da A
, für alles, was Sie ohne nicht-lokale Informationen sagen können, könnte eine Instanz einer Klasse sein Überlasten operator*
etwas komisches zu tun ;-). In den meisten Fällen verfügt der Compiler über die nicht-lokalen Informationen, die zur Disambiguierung erforderlich sind (obwohl die unglückliche Syntax immer noch bedeutet, dass der Low-Level-Parser Feedback von der übergeordneten Ebene benötigt, die die Symboltabelleninformationen enthält) ... aber mit Templates tut es das nicht (nicht generell, obwohl es in diesem speziellen Fall technisch illegal wäre, std::list<T>
zu spezialisieren, so dass sein ::iterator
KEIN Typname ist ;-).
[*] Nicht nur meine Meinung, sondern auch die Meinung von Ken Thompson und Rob Pikes, derzeit meine Kollegen, die sich mit der Entwicklung und Implementierung einer neuen Programmiersprache für den internen Gebrauch beschäftigen: diese neue Programmiersprache, während ihre Syntax ist Meistens C-like, wiederholt Cs Syntax-Designfehler NICHT - es ist die neue Sprache (wie zB im guten alten Pascal), Syntax reicht aus, um Bezeichner zu unterscheiden, die einen Typ aus denen benennen müssen, die nicht müssen ;-).
Vielleicht bearbeiten, um klarer zu machen, dass die Zeile, über die Sie sprechen, typenname ist std :: list :: iterator it = std :: finden (rep.begin(), rep.end(), itme); Ich denke, das ist deine Absicht. –
aem