Ho un enum in un namespace e mi piacerebbe usarlo come se fosse in un namespace diverso. Intuitivamente, ho pensato che avrei potuto usare "using" o "typedef" per ottenere questo risultato, ma nessuno dei due ha funzionato. Frammento di codice per dimostrarlo, testato su GCC e Sun CC:Come si importa un enum in uno spazio dei nomi diverso in C++?
namespace foo
{
enum bar {
A
};
}
namespace buzz
{
// Which of these two methods I use doesn't matter,
// the results are the same.
using foo::bar;
//typedef foo::bar bar;
}
int main()
{
foo::bar f; // works
foo::bar g = foo::A; // works
buzz::bar x; // works
//buzz::bar y = buzz::A; // doesn't work
buzz::bar z = foo::A;
}
Il problema è che l'enum in sé è importata, ma nessuno dei suoi elementi. Sfortunatamente, non posso modificare l'enum originale per essere racchiuso in uno spazio dei nomi fittizio extra o in una classe senza rompere un sacco di altri codici esistenti. La soluzione migliore che posso pensare è quello di riprodurre manualmente l'enum:
namespace buzz
{
enum bar
{
A = foo::A
};
}
Ma viola la DRY principle. C'è un modo migliore?
"Ma viola il principio ASCIUTTO." In questo caso, riconsidererei l'utilizzo del principio. "C'è un modo migliore?" le enumerazioni (sfortunatamente) non sono scope, ma puoi mettere elementi enum in struct o namespace aggiuntivi. – SigTerm
Sfortunatamente molti altri codici si basano sull'enum originale non essendo in un altro ambito:/ –
Whoa ... Se qualcuno mi avesse chiesto qualcosa del genere, avrei risposto che avrebbe dovuto funzionare. Grazie per aver rivelato questo angolo oscuro di C++ ... +1. – paercebal