2010-01-25 71 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

相關問題