20

我理解将using声明放入头文件时可能会遇到的麻烦,所以我不想这样做。相反,我尝试将using(或 a 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

在实际代码中,命名空间名称更长且烦人,我无法更改。

谁能解释为什么这是不合法的,或者(更好)是否有解决方法?

4

3 回答 3

26

你能做到typedef gee::whiz::abc::def::Hello Hello吗?

于 2010-01-25T19:13:21.457 回答
4

实际上并不是一个完全可怕的想法。它至少与它现在的工作方式一样有意义(当然,并不多)。我认为基本问题是类不是编译和链接的单位,而是“翻译单位”。但是按类来做会更干净,让类成为模块,就像在 Java 或 C# 或其他更有意义的语言中一样。

于 2010-01-25T19:13:16.130 回答
1

遇到了同样的问题,找到了这个问题。我发现如果你用匿名命名空间包装 struct foo ,你似乎可以把

也使用命名空间::many::names;

在匿名包装器的顶部。不过,这有点难看,添加了更多层的嵌套大括号。

于 2010-12-02T12:37:42.273 回答