Mehrdeutige Referenz und der namespace (der Kampf der Definitionen aus den beiden externen Bibliotheken)
Erlebe ich den Zusammenbruch der Definitionen kann ich nicht deuten.
Schematisch das problem ist wie folgt:
Die wichtigsten Projekt-Datei hat zwei umfasst:
include <lib1.h>
include <lib2.h>
Den ersten header enthält paar andere Header aus der Bibliothek, in einer von denen gibt es eine direkte (nicht mit einem name-space) definition:
template<typename T> class SparseMatrix;
Den lib2.h hat die folgenden innerhalb
namespace lib2
{
using namespace lib3;
class ...
{
...
SparseMatrix<double> ...
...
}
}
Innen lib3, abgedeckt mit dem namespace, gibt es auch eine definition der Klasse SparseMatrix.
Jede Bibliothek separat kompiliert kein problem. Wenn ich versuche zu kompilieren Sie die ausführbare Datei verwendet, der compiler erzeugt einen Fehler:
lib2.h:70:7: error: reference to 'SparseMatrix' is ambiguous
Die sieht seltsam für mich, da nirgendwo im main Programm Schreibe ich
using namespace lib3;
Somit sehe ich keinen Grund, warum diese Definitionen einstürzen sollte.
Ich würde mich sehr über jede mögliche Erklärung für das problem.
Natürlich, ich kann schließen Sie die Definitionen aus der lib1 in einem eigenen namespace, aber dann müsste ich ändern, ganz eine Reihe von Dateien, die würde ich eher nicht tun.
KOMMENTAR:
die Antwort unten ist richtig, aber ich war auch in der Lage zu bekommen, um das problem durch änderung der Reihenfolge der enthaltenen Dateien, also in Erster umfassen lib2 und dann lib1.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aber wenn man sich in
lib2.h
genau was geschrieben wurde. Die Inhalte derlib3
namespace gebrachtlib2
und sind jetzt sichtbar, wenn die Definition derSparseMatrix<double>
Objekt.Können Sie denken
lib2.h
als so etwas wie dies, nachdem alle gehört wurden behoben:Der Zeile (1) erklärt
SparseMatrix
ist sofort sichtbar in Zeile (4). Die Deklaration in Zeile (2) nicht erreicht werden, da aber Zeile (3) bringt es in namespacelib2
ist es nun auch sichtbar auf der Zeile (4).Können Sie rund um diese einfach durch voll qualifizierende Typ:
::
ohne vorangestellten Namensraum bezeichnet den globalen namespace.Ist die andere alternative, um nicht
using namespace lib3;
imlib2.h
und richtig zu qualifizieren, die Inhalte deslib3
namespace.SparseMatrix<double>
ist innerhalb derlib2
namespace. So ist es natürlich betroffen, dassusing namespace lib3
ebenfalls imlib2
.SparseMatrix
innerhalb des namespace lib2, so möchten Sie vielleicht zu habenlib2::SparseMatrix
oder::SparseMatrix
. Beide verwiesen werden kann, durch das schreibenSparseMatrix
. So ist die::
zu sagen "ich will das Globale".SparseMatrix
sichtbar in der Klasse.using namespace lib3;
imlib2
namespace. Es ist eine ziemlich große Sache zu bringen, eine ganze namespace-Inhalt in einem anderen Namensraum.