2013-05-14 108 views
6

我需要實現一個數字類,支持運算符< <輸出。 我有一個錯誤:「標識符‘ostream的一些原因eventhough我列入’未定義」,並嘗試也標識符「ostream」未定義錯誤

這裏的頭文件:

Number.h

#ifndef NUMBER_H 
#define NUMBER_H 
#include <iostream> 
class Number{ 
public: 
//an output method (for all type inheritance from number): 
virtual void show()=0; 

//an output operator: 
friend ostream& operator << (ostream &os, const Number &f); 


}; 

#endif 

爲什麼心不是編譯識別朋友功能中的ostream?

+0

因爲與所有標準庫類型和函數一樣,只有*沒有*'ostream'。只有'std :: ostream'。 – 2013-05-14 11:42:33

回答

11

您需要與類生活在命名空間的名稱完全限定名ostream

std::ostream 
// ^^^^^ 

所以,你的運營商的聲明應該成爲:

friend std::ostream& operator << (std::ostream &os, const Number &f); 
//  ^^^^^      ^^^^^ 

或者,你可以有一個using聲明前出現不合格名稱ostream出現:

using std::ostream; 

這會允許您在沒有完全限定的情況下編寫ostream名稱,就像您當前版本的程序一樣。

+0

非常感謝!可能使用命名空間std;將工作嗎? – 2013-05-14 11:11:44

+3

雖然不應該在標題的全局名稱空間中使用'',因爲這可能會導致標題其他用戶的名稱衝突。 – 2013-05-14 11:12:12

+1

@AviadChmelnik:它會起作用,但正如Mike Seymour指出的那樣,它被認爲是一種糟糕的編程習慣,因爲引入名稱衝突的可能性很高(特別是當放在全局名稱空間範圍的頭部時)。相反,如果可以,請選擇 – 2013-05-14 11:14:18

0

Andy Prowl的答案很好,但請不要在標題中加入「using std :: ostream」。如果你這樣做了,那麼其他編譯單元使用你的頭文件也會默認使用這個名字空間,並且你可以通過命名空間衝突得到令人討厭的編譯錯誤。

+2

'使用std :: ostream'將一個名稱放入使用它的命名空間:'ostream'。這遠不像使用名字空間標準符號這樣大的問題,它將每個**名字從'std'放入該名字空間。 – 2013-05-14 11:18:25

+1

其他編譯單元只會獲得'ostream'名稱,而不是名稱空間。不過,我同意這是一個壞主意。 – juanchopanza 2013-05-14 11:19:05

相關問題