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 templateSchlü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 funim Kontext von denkt, dass es sich um einen abhängigen Namen handelt f, da fes sich nicht um eine Vorlage selbst handelt. Wenn ich Czu einer regulären Klasse anstelle einer Vorlage wechsle , verschwindet der Fehler. Ich verstehe jedoch nicht, warum es überhaupt einen Fehler geben sollte, da weder Snoch fabhä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 Ses sich tatsächlich um einen abhängigen Namen handelt, dieser im Kontext fnicht abhängig wäre, wenn sie nicht Mitglieder der aktuellen Instanziierung wären.