2010-07-11 24 views
0

從摘錄「例外C++」:前置聲明庫名

「在過去,你可以只更換‘的#include’與‘類ostream的,’在這種情況下,因爲ostream的使用是一個class ostream;「是非法的,原因有兩個:

ostream現在在命名空間std中,程序員不允許聲明任何生活在namespace std。

ostream現在是一個模板的typedef;具體來說,它是typedef'd as basic_ostream。不僅basic_ost令人討厭的模板在任何情況下都會亂七八糟地向前聲明,但是你根本無法可靠地進行前向聲明,因爲庫實現允許做一些事情,比如添加自己額外的模板參數(超出標準所要求的參數),當然,你的代碼不會知道 - 規則的主要原因之一是程序員不允許在命名空間標準中爲事物編寫自己的聲明。「

我的問題:

我不明白,標誌着加粗的部分。

感謝,

+1

你的問題標題和你的問題文本問兩個不同的東西。 – 2010-07-11 08:20:30

+2

一個可怕的問題:P – 2010-07-11 08:35:44

+0

@尼爾:好吧,試圖使它們一致。 – xyz 2010-07-11 08:43:04

回答

5

在加粗的部分只是說你不能向前聲明ostream的是這樣的:

class ostream; 
  • ,因爲現在的ostream是一個typedef,並申報的細節可能會或可能不會在不同的實現方式有所不同。
  • 因爲程序員不允許在名字空間std中聲明任何東西(儘管它可以在大多數編譯器上工作)。

如果您想要提供ostream的前向聲明,請改爲包含<iosfwd>。 (或者看看你的實現看起來像什麼)。

+1

+1,如果僅僅是因爲提到了頭文件。 – paercebal 2010-07-11 09:09:31

1

你可以,如果你是確定的事實,它只會爲特定的編譯器的特定版本。這將是醜陋的,但你可以做到這一點(你可以幾乎將頭的內容複製到你的代碼中,它仍然可以工作)。

你不應該這樣做的原因正是它在標題中的原因。你想使用一些外部接口,而不想關心編譯器的內部。編譯器保證你的外部接口。至於實現,這是編譯器的選擇。

+0

當在我的頭文件中有這個: 朋友ostream&operator <<(ostream&os,const位置&p); - 包含此頭文件的所有人都應該包含2K行iostream頭文件,即使ostream僅用作引用,太糟糕了,它不適用於類型定義 - 類似於「forward_declare ostream」將是有用的 – Nuclear 2014-06-12 08:15:16