Es ist unmöglich, den Klassennamen im Deklarator der Funktionsdefinition außerhalb der Klasse vollständig zu qualifizieren

12

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.

v.oddou
quelle
2
Solange C ++ das Leerzeichen ignoriert ::, gibt es wohl keinen anderen Weg.
Yksisarvinen
@Someprogrammerdude yep, überprüfen Sie dies aus godbolt.org/z/mt6GHD
v.oddou
3
Der ::CTeil sieht aus wie eine Problemumgehung für ein anderes Problem. Sonst hätte es einfach sein können C(wie der Compiler vorschlägt;)
Rustyx
2
@rustyx Es ist nur eine mechanische Neuausgabe von Code durch einen Transpiler, der an dieser Position keinen ultrakomplexen "am wenigsten qualifizierten Namen finden" ausführen möchte. Das Ausgeben eines FQ-Namens umgeht die Suche vollständig und ist für solche Tools praktisch.
v.oddou

Antworten:

10

Sie können Klammern setzen, um Folgendes zu unterscheiden:

float4x4 (::C::M)()
{
    return float4x4{};
}

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.

idclev 463035818
quelle
1
unglaublich. in der Tat können wir. godbolt.org/z/KCFbJZ das ist ekelhaft, aber es ist großartig. Natürlich ist das Trailing stilistisch großartig. Aber in meinem Fall ziele ich auf einen Dialekt, der ihn nicht unterstützt.
v.oddou