为啥我不能在类声明中放置“使用”声明?
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 数据报怎么办?嗯嗯?所有的陷阱,没有手电筒。以上是关于为啥我不能在类声明中放置“使用”声明?的主要内容,如果未能解决你的问题,请参考以下文章