using の混ぜるな危険2012年04月22日 05時15分35秒

C++ では名前空間が導入されて、関数名、変数名が外部のライブラリと衝突するのを避けられるようになった。C 言語などで、二つの全く別のライブラリが同じ変数名などを作って、リンクできない事態に陥るのに比べたら若干ましだ。

しかし、この名前空間自体も衝突を起こす。気を付けて名前を付けておかないと、全てに完全な名前空間を指定しての呼び出しが必要になることもある。

その中で、厄介なのが階層は違うが名前が同じ名前空間がデフォルトで有効になった場合が一番、被害が酷い。


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 ファイル内または、ヘッダーファイルでも一部のクラス内程度に留めるべきだ。また、名前空間の名付け型は、なるべく同じ規律に従うこと。