Impossible de qualifier complètement le nom de classe dans le déclarant hors classe de la définition de fonction

12

Ce programme se traduit par une impasse de gourmandise d'analyse indésirable:

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

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

: 8: 1: erreur: aucun membre nommé 'C' dans 'float4x4'; vouliez-vous simplement dire «C»?
float4x4 :: C :: M ()
^ ~~~~~~~~~~~

Qui peut être «corrigé» en utilisant le type de retour arrière:

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

maintenant tout va bien.

Je suppose donc que nous ne pouvons pas entièrement qualifier le nom de classe lors de l'utilisation de la syntaxe de déclaration de type en-tête-retour?

v.oddou
la source
2
Tant que C ++ ignore les espaces autour ::, je suppose qu'il n'y a pas d'autre moyen.
Yksisarvinen
@Someprogrammerdude yep, consultez ceci godbolt.org/z/mt6GHD
v.oddou
3
La ::Cpartie ressemble à une solution de contournement pour un autre problème. Sinon, cela aurait pu être tout simplement C(comme le suggère le compilateur;)
rustyx
2
@rustyx c'est juste une réémission mécanique de code par un transpilateur qui ne veut pas exécuter un "trouver le nom le moins qualifié" ultra complexe à cette position. émettre un nom FQ contourne complètement la recherche et est pratique pour de tels outils.
v.oddou

Réponses:

10

Vous pouvez mettre des parenthèses pour lever l'ambiguïté:

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

Je ne peux pas vraiment vous dire quelle règle rend cela correct, même si ce n'est pas sans les crochets, bien que j'aie testé avec gcc et clang (les deux -pedantic). Je préférerais le type de retour arrière.

idclev 463035818
la source
1
incroyable. en effet, nous le pouvons. godbolt.org/z/KCFbJZ c'est dégoûtant mais c'est génial. Bien sûr, en termes de style, la fuite est excellente. Mais dans mon cas, je cible un dialecte qui ne le prend pas en charge.
v.oddou