Überladene Funktion



  • Hi @all,

    ich hab ein Problem mit einer überladenen Funktion.

    Socket();
    Socket(SOCKET s);
    Socket(const Socket& s);
    

    Das ist die Deklaration.

    Jetzt will ich den Zustand meines Sockets prüfen.

    Socket s = m_socket.Accept(addr);
    if( !s )
    	break;
    

    jetzt sagt mir der .NET Compiler, dass !s mehrdeutig sei, was der Compiler VC++ 6.0 nicht gemacht hat. Wie kann ich die abfrage jetzt umgestalten, das er keinen Fehler mehr rauswirft?



  • Die überladenen konstruktoren haben mit !s nichts zu tun. Ist da ein bool, int oder sonst ein operator überladen der ein ! erlauben würde? Falls ja, machen nen expliziten cast für den typen.



  • Hi CMatt,

    irgendwie versteh ich nicht so ganz, was Du meinst.
    Ich habe das jetzt umgeschrieben und es klappt auch.

    Socket s = m_socket.Accept(addr);
    if( s )
    {
    	// Alles i.O.
    }
    else
    	break;
    

    Aber das Problem ist dadurch noch nicht ganz gelöst, da ich es an einer weiteren Stelle habe.

    ASSERT(m_hThread==NULL && !m_socket);
    

    Fehlermeldung: irc.cpp(167): error C2593: 'Operator !' ist mehrdeutig

    Wenn ich das ! weglasse sagt der Compiler && ist mehrdeutig
    Was kann ich dagegen tun?



  • Kurze erklärung zu "Fehlermeldung: irc.cpp(167): error C2593: 'Operator !' ist mehrdeutig ":
    Der compiler finded mehrer Möglichkeiten ein ! auf deine Kalsse anzuwenden und weis nun nicht welcher er vewenden soll.
    bsp:

    class MyClass {
    public
      operator short();
      operator long();
    };
    
    //...
    MyClass obj;
    if(obj == 100) {
      // bla
    }
    

    Die Klasse MyClass hat einen short und einen long operator. Wenn ich jetzt z.b eine if(obj == 100) darauf aufrufe kommt der complier ins grüblen, da er 100 als short und als long betrachten kann und so nicht weis welche der 2 Methoden er nun verwenden soll um die Klasse zu casten. Abhilfe bringt dann z.b so was:

    MyClass obj;
    if((short)obj == 100) { // verwende den short operator zum vergleichen
      // bla
    }
    

    Hoffe es jetzt ist klar was da bei passiert 😉



  • Hi CMatt,

    jup, habe verstanden was Du meinst. Leider ist das in meinem Fall etwas schwieriger.
    m_Socket ist ne Variable vom Typ Socket.
    Die Socketklasse sieht so aus.

    public :
    		Socket();
    		Socket(SOCKET s);
    		Socket(const Socket& s);
    		virtual ~Socket();
    		bool Create();
    		void Close();
    		bool Bind(const InetAddr& addr);
    		bool Connect(const InetAddr& addr);
    		bool Listen();
    		Socket Accept(InetAddr& addr);
    		int Send(const unsigned char* buf, int cbBuf);
    		int Send(const char* fmt, ...);
    		int Receive(unsigned char* buf, int cbBuf);
    		bool SetOpt(int opt, const char* pBuf, int cbBuf);
    		bool GetOpt(int opt, char* pBuf, int& cbBuf);
    		operator SOCKET& () const { return (SOCKET&)m_sock; }
    		operator bool() const { return m_sock != INVALID_SOCKET; }
    
    	protected :
    		SOCKET m_sock;
    
    	private :
    		bool m_bOwnSocket;
    

    Ich hab einen blassen Schimmer was man den da nimmt.



  • operator SOCKET& () const { return (SOCKET&)m_sock; }
    operator bool() const { return m_sock != INVALID_SOCKET; }
    

    typedef UINT_PTR SOCKET; -->> typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;

    SOCKET ist also vom type unsigned int, was soll der complier nun bei deinem ! nehmen? Er kann sowohl unsigned int, als acuh bool auf ungliech null vergleichen 😉
    Du kannst also zwischen

    if( !(bool)s )
    

    und

    if( (SOCKET)s == INVALID_SOCKET )
    

    als Lösung wählen 🤡



  • Habe jetzt

    ASSERT(m_hThread==NULL && ((SOCKET)m_socket == INVALID_SOCKET ));
    

    eingegeben.
    Und alles wurd schlimmer 😞

    error LNK2001: Nichtaufgelöstes externes Symbol "class irc::CIrcSession g_ircSession" (?g_ircSession@@3VCIrcSession@irc@@A)
    error LNK2001: Nichtaufgelöstes externes Symbol "private: static class std::map<char const *,bool (__thiscall irc::CIrcMonitor::*)(class irc::CIrcMessage const *),struct irc::CIrcMonitor::LessString,class std::allocator<struct std::pair<char const * const,bool (__thiscall irc::CIrcMonitor::*)(class irc::CIrcMessage const *)> > > irc::CIrcDefaultMonitor::m_handlers" (?m_handlers@CIrcDefaultMonitor@irc@@0V?$map@PBDP8CIrcMonitor@irc@@AE_NPBVCIrcMessage@2@@ZULessString@12@V?$allocator@U?$pair@QBDP8CIrcMonitor@irc@@AE_NPBVCIrcMessage@2@@Z@std@@@std@@@std@@A)
    error LNK2001: Nichtaufgelöstes externes Symbol "private: static struct irc::CIrcMonitor::IrcCommandsMapsListEntry irc::CIrcDefaultMonitor::m_handlersMapsListEntry" (?m_handlersMapsListEntry@CIrcDefaultMonitor@irc@@0UIrcCommandsMapsListEntry@CIrcMonitor@2@A)
    fatal error LNK1120: 3 unaufgelöste externe Verweise
    

    Was nu 😕



  • 1. ASSERT löst bei FALSE aus, das hier fliegt dir also um die ohren wenn alles ok ist.
    2. Alle cpp's ans projekt gehängt? 😉


Anmelden zum Antworten