Der Linux-Header <ncurses.h>
definiert die Funktion meta
, und die C++ - Metaprogrammierungsbibliothek meta
setzt ihren gesamten Code in den globalen Namespace meta
.Namenskonflikt zwischen C++ - Bibliotheksnamensbereich und C-Linux-Funktion
Wie kann ich beide im selben C++ Programm verwenden (nicht unbedingt die gleiche TU, aber das wäre nett)? Gibt es eine Möglichkeit, den Namen Kollision zu umgehen?
kann ich denke an zwei spröde Abhilfen, aber sie sind leicht zu brechen:
Umgehung 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>
compiliert wird aber wahrscheinlich verbinden fehlschlagen, da die
ncurses
Symbole erwartet in der globale Namespace.Umgehung B:
#include <ncurses.h> namespace cpp { #include <meta/meta.hpp> } // namespace cpp
ist sehr spröde, da sie nur so lange funktionieren, wie die
meta
Bibliothek geht nicht davon aus, dass jede seiner Symbole im globalen Namespace ist. Das heißt, wenn die Bibliothek intern ein Symbol disambiguieren muss und dafür::meta::symbol_name
verwendet, wird dieser Ansatz unterbrochen.
Ansatz A wird nicht funktionieren, wie Sie selbst wissen. Ansatz B könnte funktionieren - Sie können es versuchen. Aber ich würde zuerst so viel wie ich kann versuchen, um zu sehen, ob ich diese beiden Bibliotheken trennen kann, so dass keine einzige Transitionseinheit beides verwendet. – SergeyA
Versuchen Sie, einen Wrapper für einen zu schreiben, so dass Sie nie beide Header in dieselbe Übersetzungseinheit einschließen und hoffen, dass der Linker damit einverstanden ist. – nwp
@NathanOliver '' hat eine Funktion namens meta, während '' einen Namespace namens 'meta' im globalen Namespace hat, sodass der Funktionsname mit dem Namespace-Namen kollidiert. –
gnzlbg