ヘッダーは、関数meta
を定義し、C++メタプログラミングライブラリmeta
は、すべてのコードをグローバル名前空間meta
に置きます。C++ライブラリ名前空間とC linux関数との間の名前の衝突
同じC++プログラムで両方を使用するにはどうすればよいですか(必ずしも同じTUでなくてもかまいません)。名前の衝突を回避する方法はありますか?
を私は2つの脆性の回避策を考えることができますが、彼らは壊れやすいです:
回避策A:
namespace linux { #include <ncurses.h> } // namespace linux using linux::max_align_t; // ncurses assumes it is in the global namespace #include <meta/meta.hpp>
コンパイルおそらく
ncurses
シンボルがに期待されているため、リンクに失敗しますグローバル名前空間。回避策B:それは唯一の限り
meta
ライブラリがそのシンボルのいずれかがグローバル名前空間にあることを想定していないように動作しますので、#include <ncurses.h> namespace cpp { #include <meta/meta.hpp> } // namespace cpp
は非常に脆いです。つまり、ライブラリが内部的にシンボルを明確にする必要があり、そのために
::meta::symbol_name
を使用すると、このアプローチは中断されます。
アプローチAは、あなた自身が知っているとおりに動作しません。アプローチBが動作するかもしれません - 試してみてください。しかし、私は最初に、私がこれらの2つの図書館を分けることができるかどうかを確かめることができます。 – SergeyA
同じ翻訳単位に両方のヘッダーを含めることはないように、ラッパーを作成してみてください。そうすれば、リンカーでうまくいけばいいと思います。 – nwp
@NathanOliver ''にはmetaという関数がありますが、 ''はグローバル名前空間内で 'meta'という名前空間を持っているので、関数名は名前空間の名前と衝突します。 –
gnzlbg