Linking Error mit operator Überladung



  • hi,

    habe ein Problem mit operator Überladung das mich zu Verzweiflung treibt.
    Lässt sich dur den Code am besten erklären xD
    Fehler Meldung:

    Fehler	1	error LNK2001: Nicht aufgelöstes externes Symbol ""public: class Ip & __thiscall Ip::operator++(void)" (??EIp@@QAEAAV0@XZ)".	main.obj	PortScanCPP
    

    Header:

    #pragma once
    
    #include "main.h"
    #include <string>
    #include <iostream>
    
    class Ip
    {
    protected:
    	UINT32 _ipDez;
    	UINT32 ToDez(const std::string &ip);
    public:
    	Ip(const std::string &ipString);
    	Ip(const char ipCString[]);
    	Ip(UINT32 ip);
    	Ip(Ip &ip);
    	std::string & ToString(std::string &s);
    	inline bool IsValid();
    
    	/* Operatoren */
    	friend std::istream& operator>>(std::istream& is, Ip& val);
    	friend std::ostream& operator<<(std::ostream& os, Ip& val);
    
    	inline Ip& operator++();
    	inline Ip& operator--();
    	inline Ip operator++(int);
    	inline Ip operator--(int);
    
    	inline Ip& operator+=(const int n);
    	inline Ip& operator-=(const int n);
    	inline Ip operator+(const int n);
    	inline Ip operator-(const int n);
    
    	Ip& operator=(const std::string s);
    	Ip& operator=(const char ipCString[]);
    
    	inline bool operator==(const Ip& ip);
    	inline bool operator!=(const Ip& ip);
    	inline bool operator<(const Ip& ip);
    	inline bool operator>(const Ip& ip);
    };
    

    Ausschnitt aus der *.cpp

    Ip& Ip::operator++()
    {
    	this->_ipDez++;
    	return *this;
    }
    Ip& Ip::operator--()
    {
    	this->_ipDez--;
    	return *this;
    }
    Ip Ip::operator++(int)
    {
    	Ip old = *this;
    	this->_ipDez++;
    	return old;
    }
    Ip Ip::operator--(int)
    {
    	Ip old = *this;
    	this->_ipDez--;
    	return old;
    }
    

    und zum Testen in der main

    Ip i("127.0.0.1");
    cout << "Ip:" << i << endl;
    cout << "++Ip:" << ++i << endl;
    i = "192.168.220.107";
    cout << "Ip:" << i << endl;
    

    Wenn die 3. Zeile auskommentiert ist funktionierts (was ja klar ist xD), aber mit kommt der Linking Error.
    Am Anfang gings mit dem COde auch, als ich ahber dann noch mehr Operatoren eingebaut hab gings nicht mehr (<,>,==,!=,+,-,+=,-= ohne die gings mal, als ich den code wieder auskommentiert hab gings erst nich, nach 100mal rumprobieren dann doch wieder ..)

    Weiß jemand wo mein Fehler liegt?

    mfg



  • Dein Fehler?
    Du hast den Artikel noch nicht gelesen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-232010.html
    Da steht dann auch genau drinnen, was du falsch machst...

    // edit:
    Kleiner Tipp:
    operator++() -> ++val
    operator++(int) -> val++



  • ich versteh nich was du mir sagen willst,
    ich hab den artikel schon gelesen, und mir ist klar dass operator++() Praeinkrement und operator++(int) Postinkrement ist.

    Das Problem hier ist meines Erachtens ein anderes, da ja der Passende Operator nicht gefunden wird, da er aber in der cpp Datei definiert ist, weiß ich nicht warum.

    Btw, tritt nicht nur mit ++ und -- auf, sondern auch mit allen anderen, bis auf den zuweißungsoperator, also auch i + 5; geht nicht.

    Der einzigste Unterschied zwischen den funktionierenden und nciht-funktionierend Operatoren ist ja das inline, aber nach entfernen des Schlüsselworts hats immernoch nciht funktioniert



  • Und du bist dir ganz sicher, dass du die "Ip_Impl.cpp" mitkompilierst und auch zu deiner Executable linkst?



  • da ja die Zuweißungsoperatoren und die ganz normalen Methoden und Konstruktoren funktionieren, und die komplette Implementiereung in einer Datei steht geh ich mal schwer davon aus

    edit, hab grad mal die Implementation des Praefix Operators und die header Datei geschoben, dann funktionierts ...

    edit2:
    wo sieht man in vs2008 eig welche dateien alle mitkompliliert werden?
    dachte bisher eig immer alle die im Projektexplorer zu sehen sind



  • Fällt mir jetzt erst auf:
    Nimm die inline bei der Klassendefinition weg! Dalli!
    Die gehören bei der Definition der Methoden hin!
    Dann verschwinden magischerweise die undefined references!
    Hast du denn keine Warnings bekommen?

    test.h:4: Warnung: inline-Funktion »void Test::bla() const« verwendet, aber nirgendwo definiert
    


  • ok, wenn ich alle inlines komplett raus nehm gehts,
    wenn ich sie aber in die cpp datei reinschreib gehts auch nicht, (wie vorher als sie in der .h waren)

    Warning kam vorher keine, und jetzt auch nicht ...



  • Wenn du was inline haben willst, muss das in den Header!

    struct Test
    {
        void bla1() {   // implizit inline
            doWhat();
        }
        void bla2();
        void bla3();
    };
    
    inline void
    Test::bla2() {    // explizit inline
        doWhat();
    }
    
    void
    Test::bla3()    // lassen wir den Compiler optimieren
    {
        doWhat();
    }
    

    Alles im Header.



  • ahh ok,
    soll heißen, bei allem was inline is kann ich nichmehr zwischen Schnittstelle und Implementation trennen




Anmelden zum Antworten