Nagłówek Linux <ncurses.h>
definiuje funkcję meta
, a biblioteka programowania metaprogramowania C++ meta
umieszcza cały swój kod w globalnej przestrzeni nazw meta
.Kolizja nazw między przestrzenią nazw biblioteki C++ a funkcją C linux
Jak korzystać z obu programów w tym samym programie C++ (niekoniecznie w tej samej jednostce tłumaczeniowej, ale byłoby to miłe)? Czy istnieje sposób obejścia kolizji nazw?
mogę myśleć o dwóch kruchych obejścia, ale są one łatwe do złamania:
Obejście 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>
kompiluje ale prawdopodobnie nie odwołuje ponieważ
ncurses
symbole są spodziewane w globalna przestrzeń nazw.Obejście B:
#include <ncurses.h> namespace cpp { #include <meta/meta.hpp> } // namespace cpp
jest bardzo kruchy, ponieważ to będzie działać tylko tak długo, jak biblioteka
meta
nie zakłada, że każdy z jej symboli znajdują się w globalnej przestrzeni nazw. Oznacza to, że jeśli biblioteka musi ujednoznacznić wewnętrznie symbol i używa do tego::meta::symbol_name
, podejście to zostanie zerwane.
Podejście A nie zadziała, jak sam wiesz. Podejście B może działać - możesz spróbować. Najpierw jednak postarałem się tak bardzo, jak to tylko możliwe, aby przekonać się, czy mogę oddzielić te dwie biblioteki, aby żadna z nich nie korzystała z obu tych funkcji. – SergeyA
Spróbuj napisać opaskę dla jednego, aby nigdy nie zawierał obu nagłówków w tej samej jednostce tłumaczeniowej i mam nadzieję, że linker będzie z nią w porządku. – nwp
@NathanOliver '' ma funkcję o nazwie meta, natomiast '' ma przestrzeń nazw o nazwie 'meta' w globalnym obszarze nazw, więc nazwa funkcji koliduje z nazwą przestrzeni nazw. –
gnzlbg