<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[std::thread Fehler]]></title><description><![CDATA[<p>Hier der betreffende Codeausschnitt:</p>
<pre><code>for (;;)
{
	tcp_stream handle = sock.accept();
	clients.push_back(std::thread(&amp;server::HTTPServer::handleClient, handle));
}
</code></pre>
<p>Der Fehler:</p>
<pre><code>c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional(1149): error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt
1&gt;          Klasse definiert keinen 'operator()' oder einen benutzerdefinierten Konvertierungsoperator für Zeiger auf Funktion oder Verweis auf Funktion, die die passende Argumentzahl verwenden
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional(1137): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;void std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;::_Do_call&lt;,0&gt;(std::tuple&lt;&gt;,std::_Arg_idx&lt;0&gt;)&quot;.
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional(1137): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;void std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;::_Do_call&lt;,0&gt;(std::tuple&lt;&gt;,std::_Arg_idx&lt;0&gt;)&quot;.
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\thr\xthread(195): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;void std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;::operator ()&lt;&gt;(void)&quot;.
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\thr\xthread(195): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;void std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;::operator ()&lt;&gt;(void)&quot;.
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\thr\xthread(192): Bei der Kompilierung der  Klassen-template der unsigned int std::_LaunchPad&lt;_Target&gt;::_Run(std::_LaunchPad&lt;_Target&gt; *)-Memberfunktion
1&gt;          with
1&gt;          [
1&gt;              _Target=std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;
1&gt;          ]
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\thr\xthread(187): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;unsigned int std::_LaunchPad&lt;_Target&gt;::_Run(std::_LaunchPad&lt;_Target&gt; *)&quot;.
1&gt;          with
1&gt;          [
1&gt;              _Target=std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;
1&gt;          ]
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\thr\xthread(205): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;std::_LaunchPad&lt;_Target&gt;&quot;.
1&gt;          with
1&gt;          [
1&gt;              _Target=std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;
1&gt;          ]
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\thread(49): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;void std::_Launch&lt;std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;&gt;(_Thrd_t *,_Target &amp;&amp;)&quot;.
1&gt;          with
1&gt;          [
1&gt;              _Target=std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;
1&gt;          ]
1&gt;          c:\users\xxx\documents\visual studio 2013\projects\webserver\webserver\httpserver.cpp(29): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;std::thread::thread&lt;void(__thiscall server::HTTPServer::* )(tcp_stream),network::socket_stream&lt;network::tcp&gt;&amp;&gt;(_Fn &amp;&amp;,network::socket_stream&lt;network::tcp&gt; &amp;)&quot;.
1&gt;          with
1&gt;          [
1&gt;              _Fn=void (__thiscall server::HTTPServer::* )(tcp_stream)
1&gt;          ]
</code></pre>
<p>Kann sich das jmd. erklären?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324038/std-thread-fehler</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 08:44:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324038.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Feb 2014 09:35:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::thread Fehler on Fri, 28 Feb 2014 09:35:29 GMT]]></title><description><![CDATA[<p>Hier der betreffende Codeausschnitt:</p>
<pre><code>for (;;)
{
	tcp_stream handle = sock.accept();
	clients.push_back(std::thread(&amp;server::HTTPServer::handleClient, handle));
}
</code></pre>
<p>Der Fehler:</p>
<pre><code>c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional(1149): error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt
1&gt;          Klasse definiert keinen 'operator()' oder einen benutzerdefinierten Konvertierungsoperator für Zeiger auf Funktion oder Verweis auf Funktion, die die passende Argumentzahl verwenden
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional(1137): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;void std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;::_Do_call&lt;,0&gt;(std::tuple&lt;&gt;,std::_Arg_idx&lt;0&gt;)&quot;.
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional(1137): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;void std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;::_Do_call&lt;,0&gt;(std::tuple&lt;&gt;,std::_Arg_idx&lt;0&gt;)&quot;.
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\thr\xthread(195): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;void std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;::operator ()&lt;&gt;(void)&quot;.
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\thr\xthread(195): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;void std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;::operator ()&lt;&gt;(void)&quot;.
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\thr\xthread(192): Bei der Kompilierung der  Klassen-template der unsigned int std::_LaunchPad&lt;_Target&gt;::_Run(std::_LaunchPad&lt;_Target&gt; *)-Memberfunktion
1&gt;          with
1&gt;          [
1&gt;              _Target=std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;
1&gt;          ]
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\thr\xthread(187): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;unsigned int std::_LaunchPad&lt;_Target&gt;::_Run(std::_LaunchPad&lt;_Target&gt; *)&quot;.
1&gt;          with
1&gt;          [
1&gt;              _Target=std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;
1&gt;          ]
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\thr\xthread(205): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;std::_LaunchPad&lt;_Target&gt;&quot;.
1&gt;          with
1&gt;          [
1&gt;              _Target=std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;
1&gt;          ]
1&gt;          c:\program files (x86)\microsoft visual studio 12.0\vc\include\thread(49): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;void std::_Launch&lt;std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;&gt;(_Thrd_t *,_Target &amp;&amp;)&quot;.
1&gt;          with
1&gt;          [
1&gt;              _Target=std::_Bind&lt;true,void,std::_Pmf_wrap&lt;void (__thiscall server::HTTPServer::* )(tcp_stream),void,server::HTTPServer,tcp_stream&gt;,network::socket_stream&lt;network::tcp&gt;&gt;
1&gt;          ]
1&gt;          c:\users\xxx\documents\visual studio 2013\projects\webserver\webserver\httpserver.cpp(29): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;std::thread::thread&lt;void(__thiscall server::HTTPServer::* )(tcp_stream),network::socket_stream&lt;network::tcp&gt;&amp;&gt;(_Fn &amp;&amp;,network::socket_stream&lt;network::tcp&gt; &amp;)&quot;.
1&gt;          with
1&gt;          [
1&gt;              _Fn=void (__thiscall server::HTTPServer::* )(tcp_stream)
1&gt;          ]
</code></pre>
<p>Kann sich das jmd. erklären?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385705</guid><dc:creator><![CDATA[thread_fails__(]]></dc:creator><pubDate>Fri, 28 Feb 2014 09:35:29 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread Fehler on Fri, 28 Feb 2014 09:51:37 GMT]]></title><description><![CDATA[<p>Was ist server::HTTPServer::handleClient, was ist handle?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385708</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 28 Feb 2014 09:51:37 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread Fehler on Fri, 28 Feb 2014 10:00:14 GMT]]></title><description><![CDATA[<pre><code>typedef network::socket_stream&lt;network::tcp&gt; tcp_stream;
</code></pre>
<pre><code>namespace network
{
	class ss_interface : public network_error
	{
	public:
		template &lt;typename socket_type&gt;
		friend class socket_stream;

		ss_interface(SOCKET s);
		virtual ~ss_interface();

		void close();
		virtual std::vector&lt;char&gt; recv() = 0;
		virtual void send(const char *msg, std::size_t length) = 0;

	private:
		SOCKET m_sock;
	};

	template &lt;typename protocol&gt;
	class socket_stream {};

	template &lt;&gt;
	class socket_stream&lt;tcp&gt; : public ss_interface
	{
	public:
		socket_stream(SOCKET sock) : ss_interface(sock) {}

		socket_stream(socket_stream const &amp;rhs) : ss_interface(rhs.m_sock)
		{
			setError(static_cast&lt;network::error&gt;(rhs.error().value()));
		}

		std::vector&lt;char&gt; recv() override;
		void send(const char *msg, std::size_t length) override;

		socket_stream&amp; operator=(socket_stream const&amp;) = delete;
	};
}
</code></pre>
<pre><code>void server::HTTPServer::handleClient(tcp_stream handle)
{
	if (handle.fail())
	{
		// Error
	}

	auto buffer = handle.recv();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2385709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385709</guid><dc:creator><![CDATA[thread_fails__(]]></dc:creator><pubDate>Fri, 28 Feb 2014 10:00:14 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread Fehler on Fri, 28 Feb 2014 10:07:08 GMT]]></title><description><![CDATA[<p>Ich sehe weder eine Deklaration von handle noch eine von server::HTTPServer::handleClient.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385710</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 28 Feb 2014 10:07:08 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread Fehler on Fri, 28 Feb 2014 10:17:30 GMT]]></title><description><![CDATA[<p>handle ist doch einfach das typedef auf socket_stream&lt;tcp&gt;.</p>
<p>und:</p>
<pre><code>namespace server
{
	class HTTPServer : public server_error
	{
	public:
		void start();

	private:
		void handleClient(tcp_stream handle);
		std::vector&lt;std::thread&gt; clients;
	};
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2385711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385711</guid><dc:creator><![CDATA[thread_fails__(]]></dc:creator><pubDate>Fri, 28 Feb 2014 10:17:30 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread Fehler on Fri, 28 Feb 2014 10:25:21 GMT]]></title><description><![CDATA[<p>thread_fails__( schrieb:</p>
<blockquote>
<p>handle ist doch einfach das typedef auf socket_stream&lt;tcp&gt;.</p>
</blockquote>
<p>Keine Ahnuing, du zeigst es ja nicht.</p>
<p>thread_fails__( schrieb:</p>
<blockquote>
<pre><code>namespace server
{
	class HTTPServer : public server_error
	{
	public:
		void start();

	private:
		void handleClient(tcp_stream handle);
		std::vector&lt;std::thread&gt; clients;
	};
}
</code></pre>
</blockquote>
<p>Ja, genau das war zu erwarten. Woher soll der thread einen HTTPServer nehmen, den er für den Aufruf einer nicht statischen Memberfunktion braucht? Den wirst du schon selber mit übergeben müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385713</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 28 Feb 2014 10:25:21 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread Fehler on Fri, 28 Feb 2014 10:33:52 GMT]]></title><description><![CDATA[<p>Ah, natürlich, vergessen <em>this</em> mit zu übergeben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f611.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--expressionless_face"
      title="-_-"
      alt="😑"
    /><br />
Aber ich hab doch gezeigt was <em>tcp_stream</em> bzw. <em>handle</em> ist im 2ten Post? Verstehe ich nicht ganz was das Problem ist ... trotzdem danke! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385715</guid><dc:creator><![CDATA[thread_fails__(]]></dc:creator><pubDate>Fri, 28 Feb 2014 10:33:52 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread Fehler on Fri, 28 Feb 2014 10:39:26 GMT]]></title><description><![CDATA[<pre><code>namespace network
{
	class ss_interface : public network_error//ein ss_interface ist ein Netzwerkfehler. 
//Ach, nöö, gell. 
	{
	public:
		template &lt;typename socket_type&gt;//cool
		friend class socket_stream;//umgebrochen

		ss_interface(SOCKET s);//hab immer noch keine ahnung, was 
		virtual ~ss_interface();//ss bedeutet, kackname. 

		void close();//destruktor?

...

		socket_stream(socket_stream const &amp;rhs) : ss_interface(rhs.m_sock)
		{
			setError(static_cast&lt;network::error&gt;(rhs.error().value()));//hä???
		}
</code></pre>
<p>Naja, bei so viel Fantasie erwarte ich ein vollständiges Minimalbeispiel, was den Fehler produziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385716</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 28 Feb 2014 10:39:26 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread Fehler on Fri, 28 Feb 2014 10:39:52 GMT]]></title><description><![CDATA[<p>thread_fails__( schrieb:</p>
<blockquote>
<p>Aber ich hab doch gezeigt was ... <em>handle</em> ist im 2ten Post?</p>
</blockquote>
<p>Nein, hast du nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385717</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 28 Feb 2014 10:39:52 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread Fehler on Fri, 28 Feb 2014 10:57:17 GMT]]></title><description><![CDATA[<p>Man nehme zwei unterschiedliche Sachen, sagen wir mal TCPSocket und UDPSocket. Aber ein wenig Ähnlichkeit ist da, wenigstens im Namen, verflixt!</p>
<p>Die müssen wir natürlich erstmal zusammenfassen, weil das irgendwie besser ist:</p>
<pre><code>class SocketInterface//Allein hier steckt der Wurm drin, oder? 

class TCPSocket:public SocketInterface

class UDPSocket:public SocketInterface
</code></pre>
<p>So, fertig. Funktionen können beliebig SocketInterface* bekommen und ihnen ist egal, ob das nun TCP oder UDP ist.</p>
<p>Fertig??? Nee, eigentlich nicht. Die Sockets sind doch zu unterschiedlich, bieten ja sogar unterschiedliche Funktionen an, man müßte ständig mit if zwischen den Typen trennen, das geht zu verbessern:</p>
<pre><code>struct tcp{};
struct udp{};

template &lt;typename protocol&gt;
class socket_stream

template &lt;&gt;
class socket_stream&lt;tcp&gt;:public TCPSocket

template &lt;&gt;
class socket_stream&lt;udp&gt;:public UDPSocket
</code></pre>
<p>und dann ist jeder Anwender genervt davon und trennt wieder.</p>
<pre><code>typedef network::socket_stream&lt;network::tcp&gt; tcp_stream;
</code></pre>
<p>Viola!</p>
<p>(Der Nebenwitz ist, daß man dann in Jahren kein einziges mal nen UDPSocket gebraucht hätte.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385718</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 28 Feb 2014 10:57:17 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread Fehler on Fri, 28 Feb 2014 11:09:16 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Nein, hast du nicht.</p>
</blockquote>
<p>Im ersten Post steht, dass handle vom Typ tcp_stream ist, im 2ten das typedef und die dazugehörige Deklaration.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a></p>
<p>Zugegeben, das ich von network_error erbe ist nicht gut. Allerdings finde ich die Bedienung letzten Endes intuitiver. Man könnte natürlich auch einfach network_error als privaten Member machen und mit einer Wrapper-Funktion darauf zugreifen.</p>
<p>Das ss steht für socket stream.<br />
Das close() für ein explizites Schließen eines Sockets, im Destruktor wird das natürlich auch gemacht. Zumindest ich brauche das manchmal.</p>
<p>Der Kopierkonstruktor dürfte sich hiermit erklären:</p>
<pre><code>template &lt;class A, class B&gt;
class Error
{
public:
	Error()
	{
		setError(A::ok);
	}

	bool fail() const
	{
		if (ec_.value() != static_cast&lt;int&gt;(A::ok))
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	const std::error_code &amp;error() const
	{
		return ec_;
	}

protected:
	void setError(A code)
	{
		static B cat;
		ec_.assign(static_cast&lt;int&gt;(code), cat);
	}

private:
	std::error_code ec_;
};
</code></pre>
<pre><code>namespace network
{
	enum class error
	{
		ok,
		socket_error,
		send_failed,
		connect_failed,
		accept_failed,
		bind_failed,
		recv_failed,
		listen_failed
	};

	class error_category : public std::error_category
	{
	public:
		const char *name() const override;
		std::string message(int code) const override;
	};

	typedef Error&lt;network::error, network::error_category&gt; network_error;
}
</code></pre>
<p>Und deinen letzten Post kann ich nicht wirklich nachvollziehen, was willst du mir damit jetzt sagen? Ich habe bei mir einmal socket_stream, welches nur send(), recv(), close() und noch die Fehlerfunktionalität bereitstellt.</p>
<p>Ansonsten habe ich u.a. noch einen socket_acceptor und socket_connector, welche mir ein socket_stream-Objekt zurückliefern. Ich fahre damit eigentlich ganz gut. Sicherlich könnte man das schöner machen, aber dazu bin ich in C++ nicht gut genug.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385721</guid><dc:creator><![CDATA[thread_fails__(]]></dc:creator><pubDate>Fri, 28 Feb 2014 11:09:16 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread Fehler on Fri, 28 Feb 2014 11:31:43 GMT]]></title><description><![CDATA[<p>thread_fails__( schrieb:</p>
<blockquote>
<p>Der Kopierkonstruktor dürfte sich hiermit erklären:</p>
</blockquote>
<p>Nee, nicht wie er funktioniert, sondern warum Sockets kopierbar sein sollten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385726</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 28 Feb 2014 11:31:43 GMT</pubDate></item><item><title><![CDATA[Reply to std::thread Fehler on Mon, 09 Jun 2014 11:32:50 GMT]]></title><description><![CDATA[<p>Ich bin geade dabei einen Beispiel Multitasking Chatserver zu erweitern und habe den oben beschriebenen Fehler, komme aber mit den Erklärunge hier nicht weiter.<br />
Ich habe jetzt schon Stundenlang gesucht und nichts anderes zu diesem Thema als diesen Thread gefunden.</p>
<p>Hier der Quelltext:<br />
C_chatserver.cpp</p>
<pre><code>#include &quot;H_C_chatserver.h&quot;
#include &lt;thread&gt;
using namespace std;

int C_chatserver::InitWinSock(){
	int Val = 0;
	WSAData wsaDATA;
	WORD DllVersion = MAKEWORD(2, 1);
	Val = WSAStartup(DllVersion, &amp;wsaDATA);
	return Val;
}
int C_chatserver::ServerThread(int ID){
	char* Buffer = new char[256];
	int size = 0;
	while (true){
		ZeroMemory(Buffer, 512);
		if ((size = recv(Connections[ID], Buffer, 256, NULL)) &gt; 0){

			for (int a = 0; a &lt; Counter; a++){
				if (Connections[a] == Connections[ID]){
					cout &lt;&lt; Buffer &lt;&lt; endl;
				}
				else{
					send(Connections[a], Buffer, 256, NULL);
				}
			}
		}
	}
	return 10;
}
C_chatserver::C_chatserver(string ip,int port){
	system(&quot;color 0a&quot;);

	int Val = InitWinSock();
	if (Val != 0){
		MessageBoxA(NULL, &quot;WINSOCK STARTUP ERROR!!!&quot;, &quot;Error&quot;, MB_OK | MB_ICONERROR);
		exit(1);
	}

	Connections = (SOCKET*)calloc(64, sizeof(SOCKET));

	sListen = socket(AF_INET, SOCK_STREAM, NULL);
	sConnect = socket(AF_INET, SOCK_STREAM, NULL);

	addr.sin_addr.s_addr = inet_addr(ip.c_str());
	addr.sin_port = htons(port);
	addr.sin_family = AF_INET;

	bind(sListen, (SOCKADDR*)&amp;addr, sizeof(addr));
	listen(sListen, 64);
	cout &lt;&lt; &quot;Server started&quot; &lt;&lt; endl&lt;&lt;&quot;Port: &quot;&lt;&lt;port&lt;&lt;endl&lt;&lt;&quot;IP: &quot; &lt;&lt; ip.c_str()&lt;&lt; endl;
	while (true){
		if (sConnect = accept(sListen, (SOCKADDR*)&amp;addr, &amp;addrlen)){
			Connections[Counter] = sConnect;
			char *Name = new char[64];
			ZeroMemory(Name, 64);
			sprintf(Name, &quot;%i&quot;, Counter);
			send(Connections[Counter], Name, 64, NULL);
			send(Connections[Counter], &quot;Welcome&quot;, 64, NULL);

			cout &lt;&lt; &quot;New Connection&quot; &lt;&lt; endl;
			thread t1(&amp;C_chatserver::ServerThread, Counter);
			Counter++;
		}
		Sleep(50);
	}
}
</code></pre>
<p>H_C_chatserver.h</p>
<pre><code>#include &lt;WinSock.h&gt;
#include &lt;iostream&gt;
#include &lt;Windows.h&gt;

using namespace std;

#pragma comment (lib, &quot;ws2_32.lib&quot;)

class C_chatserver{
public:
	C_chatserver(string,int);
private:
	SOCKADDR_IN addr;
	int addrlen = sizeof(addr);
	int Counter;
	SOCKET sConnect;
	SOCKET sListen;
	SOCKET *Connections;

	int InitWinSock();
	int ServerThread(int ID);

};
</code></pre>
<p>Schon im Voraus vielen Dank für eure Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403093</guid><dc:creator><![CDATA[phatheblackedition]]></dc:creator><pubDate>Mon, 09 Jun 2014 11:32:50 GMT</pubDate></item></channel></rss>