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?
c++
parsing
methods
fully-qualified-naming
v.oddou
la source
la source
::
, je suppose qu'il n'y a pas d'autre moyen.::C
partie ressemble à une solution de contournement pour un autre problème. Sinon, cela aurait pu être tout simplementC
(comme le suggère le compilateur;)Réponses:
Vous pouvez mettre des parenthèses pour lever l'ambiguïté:
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.la source