Ü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 zwischenif( !(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 VerweiseWas 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?