9

Linux<ncurses.h>ヘッダーは関数metaを定義し、C++ メタプログラミング ライブラリmetaはそのすべてのコードをグローバル名前空間に置きますmeta

同じ 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:

    #include <ncurses.h>
    namespace cpp {
    #include <meta/meta.hpp>
    }  // namespace cpp
    

    metaライブラリがそのシンボルのいずれかがグローバル名前空間にあると想定しない場合にのみ機能するため、非常に脆弱です。つまり、ライブラリがシンボルを内部的に明確にする必要があり、その::meta::symbol_nameために使用する場合、このアプローチは機能しなくなります。

4

2 に答える 2