为啥我不能在类声明中放置“使用”声明?

Posted

技术标签:

【中文标题】为啥我不能在类声明中放置“使用”声明?【英文标题】:Why can't I put a "using" declaration inside a class declaration?为什么我不能在类声明中放置“使用”声明? 【发布时间】:2011-01-09 05:48:32 【问题描述】:

我了解将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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

这仍然会污染他试图避免的命名空间。 如果在类声明中使用则不会。 是的,行得通!如果我将它设为私有 typedef,那么其他代码就不会意外使用它。 @gf,你是对的,如果 typedef 在类声明中,它会起作用。顺便说一句,我不能将我的反对票改为赞成票,即使这是我的错误,除非答案改变:( @Trent:您始终可以通过再次单击向下按钮来撤消否决票。【参考方案3】:

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

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

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

【讨论】:

嗯...但是你在头文件中有一个匿名名称空间。不确定我想打开那罐蠕虫:***.com/questions/357404/anonynous-namespaces***.com/questions/357564/… 我知道命名空间的设计是上一轮标准化的遗憾之一,因为它是在没有太多实施经验的情况下塞进的。我最近大部分时间都在使用 Boost 头库,所以在 5 分钟的实验中这似乎可以正常工作。 由于某种原因,在正常键盘输入期间触发了添加注释。两次。上面的链接受到苏格拉底稻草人的影响:大师忙于炫耀,以至于没有一个 pipsqueaks 挑战不允许在课堂范围内使用指令的理性。昨晚我读了 Bjarne 写的关于概念的文章,感觉两面都被照亮了。从上面的链接来看,没有那么多。如果我不希望我的源代码看起来像一个带有冗长冗余的 SOAP 数据报怎么办?嗯嗯?所有的陷阱,没有手电筒。

以上是关于为啥我不能在类声明中放置“使用”声明?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能在一个类中声明一个命名空间?

为啥我不能只用前向声明 C++ 声明一个类的静态成员?

为啥我不能在 uitableview 单元格中放置一个 nsarray

在指针声明中放置星号

为啥我们要在 Ruby 的类中放置一个模块?

为啥我们不能在java中的linkedHashMap中放置空键[关闭]