2008-10-05 88 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