Ich habe folgenden Code:
template <typename TC>
class C
{
struct S
{
template <typename TS>
void fun() const
{}
};
void f(const S& s)
{
s.fun<int>();
}
};
// Dummy main function
int main()
{
return 0;
}
Beim Erstellen mit gcc 9.2 und clang (9.0) wird ein Kompilierungsfehler angezeigt, da das template
Schlüsselwort zum Aufrufen erforderlich ist fun
. Clang zeigt:
error: use 'template' keyword to treat 'fun' as a dependent template name
s.fun<int>();
^
template
Ich verstehe nicht, warum der Compiler fun
im Kontext von denkt, dass es sich um einen abhängigen Namen handelt f
, da f
es sich nicht um eine Vorlage selbst handelt. Wenn ich C
zu einer regulären Klasse anstelle einer Vorlage wechsle , verschwindet der Fehler. Ich verstehe jedoch nicht, warum es überhaupt einen Fehler geben sollte, da weder S
noch f
abhängig davon TC
.
Seltsamerweise kompiliert MSVC 19.22 dies ganz gut.
Hinweis
Bevor ich abstimme, um als Betrüger von Wo und Warum zu schließen, muss ich die Schlüsselwörter "Vorlage" und "Typname" eingeben? Bitte beachten Sie, dass dies ein Sonderfall ist, in dem selbst wenn S
es sich tatsächlich um einen abhängigen Namen handelt, dieser im Kontext f
nicht abhängig wäre, wenn sie nicht Mitglieder der aktuellen Instanziierung wären.