using の混ぜるな危険 ― 2012年04月22日 05時15分35秒
しかし、この名前空間自体も衝突を起こす。気を付けて名前を付けておかないと、全てに完全な名前空間を指定しての呼び出しが必要になることもある。
その中で、厄介なのが階層は違うが名前が同じ名前空間がデフォルトで有効になった場合が一番、被害が酷い。
namespace Company
{
namespace Group
{
...
}
}
using Company::Group;
と会社の名前から名前空間を作っているヘッダーファイルがあるとする。
namespace Group
{
...
}
using Group;
さて、部署内で意志の統一が図れていなくて一部の人達は会社名を含めずに名前空間を作る。
最悪なことにヘッダーファイルに using が使われていて、各々が自分に便利なようにしている。そしてある日、偶然にもこの全く違った名前空間が一つの cpp ファイルに現れると、大量のエラーが出てくるのである。
"library/header.h", line 40: Error: The name Group is
ambiguous, Group and Company::Group.
"library/header2.h", line 36: Error: The name Group is
ambiguous, Group and Company::Group.
例え、クラスや関数が一方の名前空間にしかなくて混乱なく書く名前空間内のクラスを判別できても、一部のコンパイラは同じ名前空間が展開されているだけでエラーとみなす。
using Company::Group などとヘッダーファイルで名前空間を広げてしまうと、後々泥沼にはまる。using を乱用するにしても、せめて cpp ファイル内または、ヘッダーファイルでも一部のクラス内程度に留めるべきだ。また、名前空間の名付け型は、なるべく同じ規律に従うこと。
最近のコメント