Lösung mehrdeutige Aufrufe in C++ mit namespaces
Ich bin Zusammenführung einer statischen Bibliothek (assimp) in ein bestehendes Projekt (Spring RTS), wo sowohl die Bibliothek als auch die Projekt sind unter der normalen Entwicklung. Ich versuche, fügen Sie die Bibliothek in einer Weise, dass kann ich einfach wiederholen, die integration als neue Versionen heraus kommen.
Sowieso, das Problem ist, dass der Frühling die Bibliothek erfordert die Durchführung aller Mathematik über die streflop Mathematik-Bibliothek. In der Praxis bedeutet dies min(x,y)
sollte ersetzt werden, mit streflop::min(x,y)
überall dort, wo es verwendet wird (das ist eine Menge, wenn man bedenkt das Problem ist für alle Mathematik-Funktionen).
Ich tun könnte, die Masse regex ersetzen, aber ich hatte gehofft, für etwas ein wenig mehr elegant. Nach einigen Recherchen und Tests schien es, dass das hinzufügen using namespace streflop;
an der Spitze von jedem .cpp-Datei würde den trick tun, aber es hat nicht.
Der genaue Fehler ist:
/mnt/work/workspace/spring-patch-git/spring/rts/lib/assimp/code/FixNormalsStep.cpp:147: error: call of overloaded sqrtf(const float&) is ambiguous
/usr/include/bits/mathcalls.h:157: note: candidates are: float sqrtf(float)
/mnt/work/workspace/spring-patch-git/spring/rts/lib/streflop/SMath.h:347: note: streflop::Simple streflop::sqrtf(streflop::Simple)
Ich dachte der ganze Sinn von namespaces war zu beheben, diese Art der Sache, aber es scheint nicht, hier zu arbeiten. Ich bin ein bisschen verwirrt durch den Verweis auf streflop::Einfach wie gut. Ist das ein geschachtelten namespace und könnte sein, dass ein Teil der Grund, warum es nicht so funktioniert wie erwartet?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nur das
min
Funktion aus derstreflop
- namespace verwenden, können Siestatt
Wird dieser import nur die Namen
min
nicht den ganzen namespace.Dein Fehler ist, weil was Sie tun, importiert alle Namen aus der
streflop
- namespace, so dass Sie verwendet werden können, unqualifizierten, undsqrtf
bereits vorhanden ist unqualifiziert. Sind Sie vielleicht einschließlich C-header-Dateien, wie Sie in C? Das heißt, mitmath.h
stattcmath
? Denn wenn Sie die C++ - Header wiecmath
, die Funktionen aus der standard-Bibliothek werden in derstd
namespace, und Sie sollten nicht aufeinandertreffen, auch wenn Sie importieren Sie die ganzestreflop
namespace.Andere option ist, dass, wenn die Orte, wo man bekomme jetzt Fehler sind, können Sie explizit qualifiziert. Wie in diesem Fall, können Sie ersetzen Sie
sqrtf
mit entwederstreflop::sqrtf
oder::sqrtf
je nachdem, welche version Sie verwenden möchten.Den
streflop::Simple
hat wenig zu tun mit dem Problem; es ist nur der Parametertyp und Rückgabewert fürstreflop::sqrtf
. Der einzige Weg, Sie beteiligt ist, die bei überlast Auflösung wird es behandelt wiefloat
so, dass beidesqrtf
Funktionen aufgeführt sind, möglich, zu rufen, und der compiler kann nicht bestimmen, welche von Ihnen gemeint ist.