Nie można w pełni zakwalifikować nazwy klasy w deklaratorze definicji funkcji poza klasą

12

Ten program powoduje niepożądany ślepy zaułek:

struct float4x4 {};
class C
{
    float4x4 M();
};

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

: 8: 1: błąd: brak elementu o nazwie „C” w „float4x4”; miałeś na myśli po prostu „C”?
float4x4 :: C :: M ()
^ ~~~~~~~~~~~

Które można „naprawić” za pomocą końcowego typu zwrotu:

auto ::C::M() -> float4x4
{}

teraz wszystko dobrze.

Rozumiem więc, że nie możemy w pełni zakwalifikować nazwy klasy, używając składni deklaratora typu nagłówek-zwrot?

v.oddou
źródło
2
Dopóki C ++ ignoruje odstępy ::, przypuszczam, że nie ma innego wyjścia.
Yksisarvinen,
@Someprogrammerdude tak, sprawdź to godbolt.org/z/mt6GHD
v.oddou
3
Ta ::Cczęść wygląda jak obejście innego problemu. W przeciwnym razie mogłoby to być po prostu C(jak sugeruje kompilator;)
rustyx
2
@rustyx to tylko mechaniczna ponowna emisja kodu przez transpiler, który nie chce wykonywać w tej pozycji bardzo złożonego „znajdź najmniej kwalifikowaną nazwę”. emitowanie nazwy FQ całkowicie pomija wyszukiwanie i jest wygodne dla takich narzędzi.
v.oddou

Odpowiedzi:

10

Możesz umieścić nawiasy klarowne:

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

Nie mogę ci powiedzieć, która reguła sprawia, że ​​jest to w porządku, podczas gdy nie jest bez nawiasów, chociaż testowałem z gcc i clang (oba -pedantic). Wolałbym końcowy typ zwrotu.

idclev 463035818
źródło
1
niesamowite. rzeczywiście możemy. godbolt.org/z/KCFbJZ to obrzydliwe, ale niesamowite. Oczywiście pod względem stylu trailing jest świetny. Ale w moim przypadku wybieram dialekt, który go nie obsługuje.
v.oddou