In einigen Situationen, in denen Sie von abhängige Typ beziehen (Bedeutung "abhängig von Vorlagenparameter"), die Der Compiler kann die semantische Bedeutung des resultierenden Konstrukts nicht immer eindeutig ableiten, weil er nicht weiß, um welche Art von Name es sich handelt (dh ob es sich um einen Namen eines Typs, einen Namen eines Datenmembers oder einen Namen von etwas anderem handelt). In solchen Fällen müssen Sie die Situation disambiguieren, indem Sie dem Compiler explizit mitteilen, dass der Name zu einem Typnamen gehört, der als Mitglied dieses abhängigen Typs definiert ist.
Zum Beispiel
template <class T> struct S {
typename T::type i;
};
In diesem Beispiel wird das Schlüsselwort typename
in notwendig, dass der Code zu kompilieren.
Das gleiche passiert, wenn Sie zu einer Vorlage Mitglied der abhängigen Art beziehen möchten, das heißt zu einem Namen, der eine Vorlage bezeichnet. Sie müssen auch den Compiler helfen, indem das Schlüsselwort template
, obwohl es anders In einigen Fällen
template <class T> struct S {
T::template ptr<int> p;
};
platziert wird es notwendig sein, sowohl
template <class T> struct S {
typename T::template ptr<int>::type i;
};
zu verwenden (wenn ich die Syntax richtig bekam) .
Natürlich eine andere Rolle des Schlüsselwort typename
ist in der Schablonenparameterdeklarationen verwendet werden.
http://stackoverflow.com/questions/1600464/ – sbi