2010-01-25 123 views
15

我明白当你在一个头文件中放入一个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 

在实际的代码,命名空间名称是更长的时间,恼人的,它不是东西,我可以改变。

任何人都可以解释为什么这是不合法的,或(更好),如果有一个解决方法吗?

回答

21

你知道typedef gee::whiz::abc::def::Hello Hello

+2

这仍然会污染他正试图避免的命名空间。 – Trent 2010-01-25 19:22:37

+6

如果在类声明中使用它,则不适用。 – 2010-01-25 19:25:43

+0

是的,工作!如果我使它成为一个私人的typedef,那么其他代码不会意外地使用它。 – Dan 2010-01-25 19:32:19

4

其实不是一个完全可怕的想法。它至少与现在的工作方式(授予的,并不多)具有同样的意义。我认为基本问题是,类不是编译和链接的单位,而是“翻译单位”。但是,按类逐个地进行更清洁,将类作为模块,就像使用Java或C#或更有意义的其他语言一样。

1

有同样的问题,发现了这个问题。我想通了,如果你包结构FOO使用匿名的命名空间,似乎可以把使用命名空间

太多::很多::名称;

在匿名包装的顶部。然而,它有点丑陋,增加了更多的嵌套花括号。

+0

嗯...但是,然后你在头文件中有匿名命名空间。不知道我想打开那个蠕虫的罐头:http://stackoverflow.com/questions/357404/anonynous-namespaces http://stackoverflow.com/questions/357564/uses-for-anonymous-namespaces-in-header-文件 – Dan 2010-12-03 05:01:10

+0

据我所知,命名空间的设计是以前标准化过程中的一个遗憾,因为它被挤在没有太多实施经验的地方。我最近一直在使用Boost头文件库,所以这似乎在五分钟的实验中运行正常。 – 2010-12-04 06:28:01

+0

http://www.drdobbs.com/184401782 – 2010-12-04 06:36:55

相关问题