Linker findet Referenz nicht



  • Hallo,

    folgender Code (entschuldigt die ganzen verschachtelten Namensbereiche, evtl. liegt es ja an denen?):

    // scanner.hpp
    
    #include <string>
    
    namespace madrat { namespace Caliph { namespace Compiler { namespace Frontend {
        class Scanner {
            std::wstring stream;
            bool heedWhitespaces;
    
        public:
            void setStream(std::wstring value);
            void setHeedWhitespaces(bool value);
        }; // Scanner
    } } } }
    
    // scanner.cpp
    
    #include "scanner.hpp"
    
    namespace madrat { namespace Caliph { namespace Compiler { namespace Frontend {
        inline void Scanner::setStream(wstring value)
        {
            this->stream = value;
        }
    
        inline void Scanner::setHeedWhitespaces(bool value)
        {
            this->heedWhitespaces = value;
        }
    } } } }
    
    // main.cpp
    
    #include "scanner.hpp"
    using namespace madrat::Caliph::Compiler::Frontend;
    
    int main(int argc, char* argv[])
    {
        Scanner myScanner;
        myScanner.setStream(L"foo");
        //myScanner.setHeedWhitespaces(true); // funktioniert nicht
    }
    

    Dieser Code funktioniert. Sobald ich aber in 'main' die kommentierte Zeile auskommentiere, bekomme ich den Linkerfehler LNK2019, "1 unresolved externals":

    error LNK2019: unresolved external symbol "public: void __thiscall madrat::Caliph::Compiler::Frontend::Scanner::setHeedWhitespaces(bool)" (?setHeedWhitespaces@Scanner@Frontend@Compiler@Caliph@madrat@@QAEX_N@Z) referenced in function _main main.obj

    Woran kann das liegen? In meinen Augen sind diese beiden Setter absolut äquivalent. Der Compiler ist z.Zt. MSVC++ 8.0.



  • es könnte an der inline Deklaration der Methoden liegen, entweder entferne es oder packe die Definition auch in die Header-Datei.



  • Th schrieb:

    es könnte an der inline Deklaration der Methoden liegen

    Das würde ich auch mal spontan sagen.
    Vielleicht kommt der Compiler da irgendwie durcheinander mit da sie im selben namespace sind und dann nochmal inline.

    Vielleicht doppelt - gemoppelt oder so 😃



  • ... beuk.

    Daran lag's. Vielen Dank für den Hinweis, darauf wäre ich wahrscheinlich nie (= eine sehr lange Zeit nicht) gekommen. Das ist jetzt natürlich doof; ich möchte schon, dass der meine Properties eingliedert. Na, mal schaun, vielleicht lagere ich das dann doch alles in den Header aus.


Anmelden zum Antworten