E2105 'Template'-Qualifizierer muss einen Template-Elementnamen festlegen (C++)
Nach oben zu Compiler-Fehler und -Warnungen (C++) - Index
Wenn Quelltext compiliert wird, der auf bestimmte Weise von einem Template-Parameter abhängt, ist manchmal nicht festzustellen, ob ein Elementname zum Namen einer Template-Funktion oder zu einem normalen Parameter aufgelöst wird. Im folgenden Quelltext ist ein ‘Template’-Qualifizierer erforderlich, um festzustellen, ob der Operator ‘<’ (kleiner als) als Beginn einer Template-Argumentliste oder als normaler Operator interpretiert werden soll:
template<class T>
void foo(T a)
{
a.member<10>();
}
Für den Programmierer ist die Bedeutung offensichtlich. Der Compiler kann jedoch nicht wissen, dass sich "member" auf eine Template-Elementfunktion bezieht. Daher zerlegt er diese Zeile folgendermaßen:
a.member < (10>());
Um dem Compiler mitzuteilen, dass das Kleiner-Zeichen eine Template-Argumentliste einleitet, ist der ‘Template’-Qualifizierer erforderlich:
a.template member<10>(); // "member" muss ein Template-Element sein
Wenn der ‘Template’-Qualifizierer in einer Situation verwendet wird, in der "member” nicht zu einem Template-Element aufgelöst werden kann, gibt der Compiler die obige Meldung aus.