Comment puis-je me débarrasser de l’avertissement sans cibler explicitement l’énumération? Le code conforme aux normes serait à comparer à foo::bar::mUpload
(voir ici ), mais les scopes explicites sont très longues et rendent la chose sacrément illisible.
Peut-être y a-t-il une autre façon de ne pas utiliser typedef? Je ne veux pas modifier l’énumération – je ne l’ai pas écrite et elle est utilisée ailleurs.
warning C4482: nonstandard extension used: enum 'foo::bar::baz' used in qualified name
namespace foo { class bar { enum baz {mUpload = 0, mDownload}; } } typedef foo::bar::baz mode_t; mode_t mode = getMode(); if (mode == mode_t::mUpload) //C4482 { return uploadthingy(); } else { assert(mode == mode_t::mDownload); //C4482 return downloadthingy(); }
Si l’énumération est définie dans une classe, le mieux que vous puissiez faire est de la class_name::value
dans votre propre domaine et d’utiliser simplement class_name::value
ou de définir un typedef de la classe. En C ++ 03, les valeurs d’une énumération font partie de la scope englobante (qui dans votre cas est la classe). En C ++ 0x / 11, vous pourrez qualifier les valeurs avec le nom enum:
namespace first { namespace second { struct enclosing { enum the_enum { one_value, another }; } }} using first::second::enclosing; typedef first::second::enclosing the_enclosing; assert( enclosing::one_value != the_enclosing::another );
Dans le futur, votre utilisation sera correcte (C ++ 11):
typedef first::second::enclosing::the_enum my_enum; assert( my_enum::one_value != my_enum::another );
Vous pouvez inclure votre énumération dans un espace de noms, puis utiliser une instruction using
sur cet espace de noms.
Cela ne fonctionne évidemment que pour enum en dehors de la classe.
Dans votre cas, je ne vois pas pourquoi vous ne l’ bar::mUpload
(après avoir using namespace foo
ou using foo::bar
)
Vous pouvez utiliser un typedef pour foo :: bar:
typedef foo::bar fb; //... fb::baz m = fb::mUpload;
Ou cherchez-vous quelque chose de différent?