L'intestazione Linux <ncurses.h>
definisce la funzione meta
e la libreria di metaprogrammazione C++ meta
inserisce tutto il suo codice nello spazio dei nomi globale meta
.Nome collisione tra lo spazio dei nomi della libreria C++ e la funzione C linux
Come posso utilizzare entrambi nello stesso programma C++ (non necessariamente la stessa TU ma sarebbe bello)? C'è un modo per aggirare il nome collision?
mi viene in mente due soluzioni fragili, ma sono facili da rompere:
Soluzione 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>
compila ma probabilmente non riescono a collegare in quanto le
ncurses
simboli sono attesi nel lo spazio dei nomi globale.Soluzione B:
#include <ncurses.h> namespace cpp { #include <meta/meta.hpp> } // namespace cpp
è molto fragile in quanto funziona solo fino a quando la libreria
meta
non si assume che qualsiasi dei suoi simboli sono nel namespace globale. Cioè, se la biblioteca ha bisogno di disambiguare internamente un simbolo e usa::meta::symbol_name
per quello, questo approccio si interromperà.
L'approccio A non funzionerà, come sapete voi stessi. L'approccio B potrebbe funzionare - puoi provare. Ma prima dovrei cercare di separare queste due librerie in modo che nessuna singola unità di transalione usi entrambe le cose. – SergeyA
Prova a scrivere un wrapper per uno in modo da non includere mai entrambe le intestazioni nella stessa unità di traduzione e sperare che il linker funzioni correttamente. – nwp
@NathanOliver '' ha una funzione chiamata meta, mentre '' ha uno spazio dei nomi chiamato 'meta' all'interno del namespace globale, quindi il nome della funzione si scontra con il nome dello spazio dei nomi. –
gnzlbg