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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.