2008-10-05 89 views
27

在特定命名空間中創建庫時,爲該命名空間中的類提供重載運算符通常很方便。看來(至少使用g ++)的重載運算符可以在圖書館的命名空間來實現:C++中的命名空間和運算符重載

namespace Lib { 
class A { 
}; 

A operator+(const A&, const A&); 
} // namespace Lib 

或全局命名空間

namespace Lib { 
class A { 
}; 
} // namespace Lib 

Lib::A operator+(const Lib::A&, const Lib::A&); 

從我的測試中,他們似乎都做工精細。這兩個選項有什麼實際區別嗎?兩種方法都更好嗎?

回答

29

您應該在庫命名空間中定義它們。 無論如何,編譯器會通過依賴於參數的查找找到它們。

不需要污染全局名稱空間。

+4

使用庫名稱空間的另一個原因:[本文](http://stackoverflow.com/questions/5195512/namespaces-and-operator-resolution)包含一個使用全局名稱空間不起作用的示例。 – Tim 2015-06-15 11:20:28

2

您應該在名稱空間中定義它,這是因爲語法不會太冗長,也不會混淆全局名稱空間。

其實,如果你在你的類定義定義你的過載,這將成爲一個懸而未決的問題:

namespace Lib { 

class A { 
public: 
    A operator+(const A&); 
}; 

} // namespace Lib 
+1

這可能是一個壞主意,因爲這意味着如果B可以隱式轉換爲A但不是A的子類,那麼A + B可以工作,但是B + A會混淆不清。當然,這並不一定重要,例如,如果你的房屋風格禁止用戶定義類型之間的隱式轉換。 – 2008-10-05 14:30:47

+1

我同意:存在A + B工作的問題,但不是B + A(例如,A是模擬複數的類,B是int)。另一個問題是非友元運算符+函數增加了類的封裝,而類方法減少了它。 – paercebal 2008-10-12 00:38:51