为什么我不能在类声明中放入“using”声明?

时间:2010-01-25 19:08:30

标签: c++ namespaces header compiler-errors using

我理解当您在头文件中放置using声明时可以遇到的麻烦,所以我不想这样做。相反,我试图将using(或namespace foo =)放在类声明中,以减少头文件中的重复输入。不幸的是我遇到编译错误。似乎它将是一个有用的功能。

#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::abc::def::Hello &hello); // annoyingly long-winded

    Foo(other::Hello &hello); // better
    //...
};

} } } // end x::y::z namespace

#endif // FOO_H

在实际代码中,命名空间名称更长,更烦人,而且我不能改变它。

任何人都可以解释为什么这不合法,或者(更好)是否有解决方法?

3 个答案:

答案 0 :(得分:24)

你可以typedef gee::whiz::abc::def::Hello Hello吗?

答案 1 :(得分:4)

实际上并不是一个非常可怕的想法。它至少与现在的工作方式一样有意义(授予,并不多)。我认为基本问题是类不是编译和链接的单位,而是“翻译单元”。但是按类进行操作要清晰得多,将类作为模块,比如Java或C#或其他更有意义的语言。

答案 2 :(得分:1)

有同样的问题,发现了这个问题。我想通过如果你用一个匿名命名空间包装struct foo,似乎你可以把

使用名称空间:: many :: names;

位于匿名包装器的顶部。但是,它有点丑陋,增加了更多的嵌套大括号层。