Dieses Programm führt zu einer unerwünschten Sackgasse bei der Analyse von Gier:
struct float4x4 {};
class C
{
float4x4 M();
};
float4x4 ::C::M()
{
return float4x4{};
}
: 8: 1: Fehler: Kein Mitglied mit dem Namen 'C' in 'float4x4'; Meinten Sie einfach "C"?
float4x4 :: C :: M ()
^ ~~~~~~~~~~~~
Was mit dem Trailing-Return-Typ 'behoben' werden kann:
auto ::C::M() -> float4x4
{}
jetzt alles gut.
Ich gehe also davon aus, dass wir den Klassennamen bei Verwendung der Deklaratorsyntax vom Typ "Überschrift-Rückgabetyp" nicht vollständig qualifizieren können.
c++
parsing
methods
fully-qualified-naming
v.oddou
quelle
quelle
::
, gibt es wohl keinen anderen Weg.::C
Teil sieht aus wie eine Problemumgehung für ein anderes Problem. Sonst hätte es einfach sein könnenC
(wie der Compiler vorschlägt;)Antworten:
Sie können Klammern setzen, um Folgendes zu unterscheiden:
Ich kann dir nicht wirklich sagen, welche Regel dies in Ordnung macht, obwohl es nicht ohne die Klammern ist, obwohl ich mit gcc und clang (beide
-pedantic
) getestet habe . Ich würde den nachfolgenden Rückgabetyp bevorzugen.quelle