Warum man using namespace std; nicht verwenden sollte
Guten Abend Dev's!
Ich habe bei meiner Socketverbindung ein kleines Problem und zwar kriege ich bei der bind Funktion seit neusten den Fehler: C2440, ich weiß leider nicht, was ich verändert habe, was den Fehler auslösen könnte.
Aufgrunddessen muss ich euch leider damit belästigen
Quellcode(nur das wichtigste, der Rest wurde entfernt): - Zeile 46
error C2440: '=': 'std::_Bind<_Forced,_Ret,_Fun,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t,_V5_t,<unnamed-symbol>>' kann nicht in 'long' konvertiert werden
with
[
_Forced=false,
_Ret=void,
_Fun=SOCKET &,
_V0_t=sockaddr *,
_V1_t=int &,
_V2_t=std::_Nil,
_V3_t=std::_Nil,
_V4_t=std::_Nil,
_V5_t=std::_Nil,
<unnamed-symbol>=std::_Nil
]
Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
Hast du "using namespace std;" in deinem Code? Du rufst in deinem Code die std::bind Funktion auf und nicht die Winsock-Funktion.
Um das zu lösen, kannst du :: vor deinen Aufruf schreiben, um den globalen Namespace zu verwenden oder du entfernst dein using namespace, was wohl die bessere Lösung wäre.
Hast du "using namespace std;" in deinem Code? Du rufst in deinem Code die std::bind Funktion auf und nicht die Winsock-Funktion.
Um das zu lösen, kannst du :: vor deinen Aufruf schreiben, um den globalen Namespace zu verwenden oder du entfernst dein using namespace, was wohl die bessere Lösung wäre.
Es wird in der Tat versucht, std::bind aufgerufen, wenn die Fehlermeldung stimmt. Dann verwendest du auch VS 2010 oder VS 2012.
Hast du "using namespace std;" in deinem Code? Du rufst in deinem Code die std::bind Funktion auf und nicht die Winsock-Funktion.
Um das zu lösen, kannst du :: vor deinen Aufruf schreiben, um den globalen Namespace zu verwenden oder du entfernst dein using namespace, was wohl die bessere Lösung wäre.
Es wird in der Tat versucht, std::bind aufgerufen, wenn die Fehlermeldung stimmt. Dann verwendest du auch VS 2010 oder VS 2012.
Ich verwende VS2012. Ein using namespace std; ist ebenfalls so gut wie immer vorhanden, derzeit auch. Wie wandel ich nun das bind() wieder als Winsock Funktion um?
Ich kann mir garnicht erklären, was ich verändert habe, das den Fehler auslöst
Streich das using namespace std;
Die faule und schnellere Variante wäre ::bind
Aber warum überschreibt sozusagen nun std die Winsock-Funktion? Außerdem bekomme ich ein C2198 auf meine Threadfunktion, wenn ich eine deiner Lösugsvorschläge ausprobiere.
Weil sie nunmal gleich heißen. Woher soll der Compiler bitte wissen, welches bind du meinst? Deshalb nimmt er das aus dem Namensraum, den du ihm vorgibst, was du mit using namespace std; getan hast.
Deshalb ist using namespace im globalen Kontext böse.
Wie sieht denn jetzt der Code aus, in dem vorher der Fehler auftrat? Und wie steht der Code mit den Threads damit in Verbindung? Wo wird der neue Fehler genau geworfen?
std::bind überschreibt ::bind nicht, aber std::bind lässt einfach alles als Argument zu. Argumente sind:
SOCKET, sockaddr*, int
::bind erwartet:
SOCKET, const sockaddr*, int
std::bind erwartet:
Fn&&, Arg1&&, Arg2&&
Damit ist std::bind einfach die bessere Wahl. Da muss nichts konvertiert werden. Also wird die Templatefunktion std::bind<SOCKET, sockaddr*, int> gewählt.
Das hat nichts damit zu tun, dass mit using namespace std; irgendein Namensraum "vorgegeben" wird, sondern damit, dass std::bind und ::bind beide als bind ansprechbar sind. Aber das sind sie nur, weil du using namespace std; verwendetest. Du solltest auf using namespace generell verzichten.
Der Compilerfehler C2198 entsteht, weil du im Kontruktoraufruf für t0 ein Argument zu wenig übergibst. Die Funktionssignatur von getuser sieht etwa so aus:
void getuser (long, SOCKET, SOCKET, sockaddr_int, int)
Du aber übergibst dem Konstruktor als Argumente für getuser:
long, SOCKET, sockaddr_in, int
Das ist ein SOCKET zu wenig. Kein Wunder, dass sich der Compiler beschwert.
Deine Logik leuchtet mir nicht ein... zuerst startest du drei Threads, welche dann sofort getuser, msgtrans und sendmsg ausführen;
dann wartest du, bis getuser zurückkehrt;
dann rufst du die Funktion recv auf und wartest danach, bis msgtrans zurückkehrt;
dann rufst du die Funktion send auf und wartest danach, bis sendmsg zurückkehrt.
Warum?
Du solltest dir std::async und std::future ansehen, damit geht das viel besser.
Weil sie nunmal gleich heißen. Woher soll der Compiler bitte wissen, welches bind du meinst? Deshalb nimmt er das aus dem Namensraum, den du ihm vorgibst, was du mit using namespace std; getan hast.
Deshalb ist using namespace im globalen Kontext böse.
Wie sieht denn jetzt der Code aus, in dem vorher der Fehler auftrat? Und wie steht der Code mit den Threads damit in Verbindung? Wo wird der neue Fehler genau geworfen?
Der Fehler wird bei der Generierung der Threads geworfen, sprich
Laut Fehlermeldung hat dein Funktionsaufruf zu wenig Argumente. Was mir auffällt:
Dort steht, der Prototyp hat 2 Socket Parameter.
Quote:
Originally Posted by Tasiro
std::bind überschreibt ::bind nicht, aber std::bind lässt einfach alles als Argument zu. Argumente sind:
SOCKET, sockaddr*, int
::bind erwartet:
SOCKET, const sockaddr*, int
std::bind erwartet:
Fn&&, Arg1&&, Arg2&&
Damit ist std::bind einfach die bessere Wahl. Da muss nichts konvertiert werden. Also wird die Templatefunktion std::bind gewählt.
Das hat nichts damit zu tun, dass mit using namespace std; irgendein Namensraum "vorgegeben" wird, sondern damit, dass std::bind und ::bind beide als bind ansprechbar sind. Aber das sind sie nur, weil du using namespace std; verwendetest. Du solltest auf using namespace generell verzichten.
Mehr zu Templates und Überladungen: .
Das meinte ich damit auch, von überschreiben habe ich nicht gesprochen.
Letztendlich wird dadurch std::bind zu einer Überladung.
Entschuldige die unklare Ausdrucksweise.
Warum sollte man nicht die Lane pushen in 3v3? / Range vs Nah 10/02/2013 - League of Legends - 18 Replies Ich sehe z.B wie ein Challenge oder auch andere Leute immer die Minions ie Arbeit machen lassen, und nur lasthitten, ich klopp da mit meinem aa noch drauf und versuch dann zu lasthitten.
Warum sollte man das nicht tun.
2. Frage : Ich spiele Aatrox und hab als Gegner Catlyn oder sonst nen AD-Fernchamp, wie sollte ich am besten spielen, sie kann mich immer von der Ferne in Schach halten und mich hitten, ich aber sie nicht.
BF3 - Warum Kann ich Auf Manchen Maps die AK oder die M4A1 nicht verwenden? 11/10/2011 - Battlefield - 9 Replies warum kann ich eig. auf manchen maps die m4a1 oder ak nich bentuzen? z.b auf der map mit dem zug kann ich die ak nich nehmen und auf anderen kann ich die m4a1 nich nehmen-.-. weis jemand warum das nich geht?
oder is des bei jedem so?
danke für antworten :)