Why can't I put a "using" declaration inside a class declaration?
I understand the troubles you can get into when you put a using
declaration inside a header file, so I don't want to do that. Instead I tried to put the using
(or a namespace foo =
) within the class declaration, to cut down on repetitive typing within the header file. Unfortunately I get compiler errors. Seems like it would be a useful feature.
#ifndef FOO_H
#define FOO_H
// This include defines types in namespace gee::whiz::abc::def,
// such as the class Hello.
#include "file_from_another_namespace.h"
// using namespace gee::whiz::abc::def; // BAD!
namespace x {
namespace y {
namespace z {
struct Foo {
using namespace gee::whiz::abc::def; // Illegal.
namespace other = gee::whiz::abc::def; // Illegal.
// Foo(gee::whiz::开发者_StackOverflow中文版abc::def::Hello &hello); // annoyingly long-winded
Foo(other::Hello &hello); // better
//...
};
} } } // end x::y::z namespace
#endif // FOO_H
In the real code, the namespace names are much longer and annoying and it's not something I can change.
Can anyone explain why this is not legal, or (better) if there's a workaround?
Could you do typedef gee::whiz::abc::def::Hello Hello
?
actually not a totally horrid idea. It makes at least as much sense as how it works now (which granted, isn't much). I think the basic problem is that classes are not the unit of compilation and linking, but 'translation units'. But doing it class by class is much cleaner, having classes be modules, like in Java or C# or other languages that make more sense.
Had the same problem, found this question. I figured out that if you wrap struct foo with an anonymous namespace, it seems you can put
using namespace too::many::names;
at the top of the anonymous wrapper. It's kind of ugly, though, adding more layers of nested braces.
精彩评论