Linkerfehler: "unresolved external symbol"
-
Hallo,
ich habe in mehreren Compilern (GCC, MSVC++) einen Linkerfehler bei einem Projekt, welches folgenden Code enthält (stark verkürzt, u.a. include-Guards weggelassen):
// matrix.hpp namespace madrat { namespace Utility { template<class T> class Matrix { public: // ... int rows() const; }; }}// matrix.cpp #include "matrix.hpp" using namespace madrat::Utility; // ... template<class T> inline int Matrix<T>::cols() const { return this->data[0].size(); }// alignment.hpp #include <map> namespace madrat { namespace bioinf { class Alignment : public std::pair<int, int> { public: // ... datentyp do_align(/* args */); }; }}// alignment.cpp #include "alignment.hpp" #include "matrix.hpp" using namespace madrat::bioinf; datentyp Alignment::do_align(/* args */) { madrat::Utility::Matrix<int> F(/* ... */); // ... F.cols(); // * }IMHO sind dort alle Implementierungen korrekt referenziert, trotzdem meldet der Linker den Fehler "unresolved external symbol [...] madrat::Utility::Matrix<int> [...]" in der Zeile mit dem Stern (und in Wahrheit für jeden einzelnen Zugriff auf Mitglieder der öffentlichen Schnittstelle von 'Matrix' in der Funktion 'do_align').
Ich habe auch schon mal versucht, das 'inline' in der Definition von 'cols' wegzulassen, da das mit verschachtelten Namensbereichen schon in früheren Projekten von mir Probleme bereitet hat, das hat aber auch nicht geholfen.
Kann mir das jemand erklären?
-
Schon versucht die Templatedeklarationen in die Headerdatei zu verlegen?
-
Ich meinte Templatedefinitionen
-
1r0ll|/|4514h schrieb:
Ich meinte Templatedefinitionen
Sorry ... ich verstehe nicht, was Du mit "Templatedefinitionen" in diesem Kontext meinst.
-
-
Vielen Dank für die Info. Problem behoben. Ich war fest davon überzeugt, bereits Klassen mit Typenparametern getrennt deklariert/implementiert zu haben.