<?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[boost::checked_delete überladen?]]></title><description><![CDATA[<pre><code class="language-cpp">namespace boost
{	
	template&lt;&gt; inline void	checked_delete&lt;HANDLE&gt;(const HANDLE&amp; Handle)
	{
		if(Handle!=INVALID_HANDLE_VALUE)
		{
			CloseHandle(Handle);
		}
	}
}
</code></pre>
<p>Fehler: error C2912: explicit specialization; 'void boost::checked_delete&lt;HANDLE&gt;(const HANDLE &amp;)' is not a specialization of a function template</p>
<p>Was ist falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/179570/boost-checked_delete-überladen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 08:34:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/179570.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 23 Apr 2007 11:30:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::checked_delete überladen? on Mon, 23 Apr 2007 11:30:13 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">namespace boost
{	
	template&lt;&gt; inline void	checked_delete&lt;HANDLE&gt;(const HANDLE&amp; Handle)
	{
		if(Handle!=INVALID_HANDLE_VALUE)
		{
			CloseHandle(Handle);
		}
	}
}
</code></pre>
<p>Fehler: error C2912: explicit specialization; 'void boost::checked_delete&lt;HANDLE&gt;(const HANDLE &amp;)' is not a specialization of a function template</p>
<p>Was ist falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271661</guid><dc:creator><![CDATA[boostA-G@nGSt@]]></dc:creator><pubDate>Mon, 23 Apr 2007 11:30:13 GMT</pubDate></item><item><title><![CDATA[Reply to boost::checked_delete überladen? on Mon, 23 Apr 2007 11:36:36 GMT]]></title><description><![CDATA[<p>btw: checked_delete.hpp:</p>
<pre><code class="language-cpp">namespace boost
{

// verify that types are complete for increased safety

template&lt;class T&gt; inline void checked_delete(T * x)
{
    // intentionally complex - simplification causes regressions
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
    (void) sizeof(type_must_be_complete);
    delete x;
}
//...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1271669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271669</guid><dc:creator><![CDATA[boostA-G@nGSt@]]></dc:creator><pubDate>Mon, 23 Apr 2007 11:36:36 GMT</pubDate></item><item><title><![CDATA[Reply to boost::checked_delete überladen? on Mon, 23 Apr 2007 11:40:10 GMT]]></title><description><![CDATA[<p>Ahso, HANDLE = void*, daher dieser komische Fehler.<br />
Wie geht es nun richtig? Checked_delete kann ich ja nicht mehr überladen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271670</guid><dc:creator><![CDATA[boostA-G@nGSt@]]></dc:creator><pubDate>Mon, 23 Apr 2007 11:40:10 GMT</pubDate></item><item><title><![CDATA[Reply to boost::checked_delete überladen? on Mon, 23 Apr 2007 11:44:34 GMT]]></title><description><![CDATA[<p>checked_delete erwartet einen Zeiger, keine Referenz.</p>
<pre><code class="language-cpp">template&lt;&gt; inline void    checked_delete&lt;void&gt;(void * Handle)
{

}
</code></pre>
<p>oder meinst du</p>
<pre><code class="language-cpp">template&lt;&gt; inline void    checked_delete&lt;void *&gt;(void ** Handle)
{

}
</code></pre>
<p>???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271671</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Mon, 23 Apr 2007 11:44:34 GMT</pubDate></item><item><title><![CDATA[Reply to boost::checked_delete überladen? on Mon, 23 Apr 2007 12:01:28 GMT]]></title><description><![CDATA[<p>typedef void* HANDLE<br />
HANDLE ist void*. Das Problem ist nun aber, dass nich jedes void* ein HANDLE ist und daher nicht mit CloseHandle gelöscht werden soll <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":\"
      alt="😕"
    /> Kann man nicht irgendwelche pointer-traits für HANDLE anlegen, mit denen scoped_ptr dann arbeitet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271687</guid><dc:creator><![CDATA[boostA-G@nGSt@]]></dc:creator><pubDate>Mon, 23 Apr 2007 12:01:28 GMT</pubDate></item><item><title><![CDATA[Reply to boost::checked_delete überladen? on Mon, 23 Apr 2007 12:05:28 GMT]]></title><description><![CDATA[<p>Auf die Weise nicht - typedef's kannst du nicht als Unterscheidungskriterium für Überladungen verwenden. Das heißt für den Compiler sind 'HANDLE' und 'void*' identisch, wenn du nichts dagegen tust (aber das liegt dann vor allem in deiner Disziplin).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271691</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 23 Apr 2007 12:05:28 GMT</pubDate></item><item><title><![CDATA[Reply to boost::checked_delete überladen? on Mon, 23 Apr 2007 13:15:58 GMT]]></title><description><![CDATA[<p>Ja klar.<br />
Anyway, ich möchte einfach einen scoped_ptr für HANDLE's. Geht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271750</guid><dc:creator><![CDATA[boostA-G@nGSt@]]></dc:creator><pubDate>Mon, 23 Apr 2007 13:15:58 GMT</pubDate></item><item><title><![CDATA[Reply to boost::checked_delete überladen? on Tue, 24 Apr 2007 00:58:32 GMT]]></title><description><![CDATA[<p>boostA-G@nGSt@ schrieb:</p>
<blockquote>
<pre><code class="language-cpp">namespace boost
{	
	template&lt;&gt; inline void	checked_delete&lt;HANDLE&gt;(const HANDLE&amp; Handle)
	{
		if(Handle!=INVALID_HANDLE_VALUE)
		{
			CloseHandle(Handle);
		}
	}
}
</code></pre>
<p>Fehler: error C2912: explicit specialization; 'void boost::checked_delete&lt;HANDLE&gt;(const HANDLE &amp;)' is not a specialization of a function template</p>
<p>Was ist falsch?</p>
</blockquote>
<p>Das geht so in C++ einfach nicht, du darfst Funktions Templates nicht &quot;full&quot; spezialisieren, musst überladen stattdessen (nen nicht-Template Overload hat eh immer Vorrang, daher ist das OK):</p>
<pre><code class="language-cpp">namespace boost
{	
	inline void checked_delete(HANDLE Handle)
	{
		if(Handle!=INVALID_HANDLE_VALUE)
		{
			CloseHandle(Handle);
		}
	}

	// eine gültige Spezialisierung sähe z.B. so aus:
	template &lt;class T&gt; inline void checked_delete(std::vector&lt;T&gt; const&amp; t)
	{
		// ...
	}

}
</code></pre>
<p>Bloss ist das wie schon erwähnt wurde Dreck^4, weil der Overload für sämtliche &quot;void*&quot; gilt, und nicht nur für Handles. Pöse.</p>
<p>Für shared_ptr solltest du lieber beim Anlegen einen geeigneten Deleter übergeben, und scoped_ptr für HANDLE vergiss einfach.<br />
Du kannst natürlich gerne checked_delete überladen wenn dir danach ist Unsinn zu machen, aber du wurdest gewarnt.</p>
<p>Wo ist denn überhaupt das Problem? Mach doch einfach nen &quot;handle_guard&quot; der genau für Win32 Handles die mit CloseHandle geschlossen werden sollen bestimmt ist, ist ja kein Aufwand, sind ein paar Zeilen. In Low-Level Code verwende ich das oft so:</p>
<pre><code class="language-cpp">struct win32_handle_guard
{
    HANDLE m_h;
    explicit win32_handle_guard(HANDLE h = 0)
        : m_h(h)
    {}
    ~win32_handle_guard()
    {
        if (m_h != 0 &amp;&amp; m_h != INVALID_HANDLE_VALUE)
        {
            bool rc = ::CloseHandle(m_h);
            assert(rc);
        }
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1272100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272100</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 24 Apr 2007 00:58:32 GMT</pubDate></item><item><title><![CDATA[Reply to boost::checked_delete überladen? on Tue, 24 Apr 2007 08:33:31 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Das geht so in C++ einfach nicht, du darfst Funktions Templates nicht &quot;full&quot; spezialisieren</p>
</blockquote>
<p>Irrtum. Du kannst sie nicht partiell spezialisieren. Eine vollständige Spezialisierung ist möglich und legal. Allerdings darf eine Spezialisierung die Signatur nicht ändern, aus einem:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void f(T* x);
</code></pre>
<p>kann also kein</p>
<pre><code class="language-cpp">template &lt;&gt; 
void f(int&amp; x);
</code></pre>
<p>werden, da es keine Ersetzung gibt, die aus T* ein int&amp; macht. Ein</p>
<pre><code class="language-cpp">template &lt;&gt;
void f(int*);
</code></pre>
<p>hingegen ist völlig korrekt und eine vollständige Spezialisierung des Base-Templaes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272218</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Tue, 24 Apr 2007 08:33:31 GMT</pubDate></item><item><title><![CDATA[Reply to boost::checked_delete überladen? on Tue, 24 Apr 2007 08:45:07 GMT]]></title><description><![CDATA[<p>HumeSikkins schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Das geht so in C++ einfach nicht, du darfst Funktions Templates nicht &quot;full&quot; spezialisieren</p>
</blockquote>
<p>Irrtum. Du kannst sie nicht partiell spezialisieren....</p>
</blockquote>
<p>Puh !!! Da bin ich aber erleichtert - ich war schon schwer verwirrt und eigentlich wage ich nur sehr selten, hustbaer zu widersprechen...<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272227</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 24 Apr 2007 08:45:07 GMT</pubDate></item><item><title><![CDATA[Reply to boost::checked_delete überladen? on Tue, 24 Apr 2007 14:46:08 GMT]]></title><description><![CDATA[<p>Hmpf.<br />
Jetzt bin ich zwar verwirrt, aber OK.<br />
Template Funktionen sind von den Regeln her sowieso ... eigen.</p>
<p>Was auf jeden Fall geht ist ein non-template-Overload, und ... ich denke man kann auch weitere template-Overloads machen, was dann im Prinzip gleich aussehen kann wie eine partielle Spezialisierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272521</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 24 Apr 2007 14:46:08 GMT</pubDate></item><item><title><![CDATA[Reply to boost::checked_delete überladen? on Tue, 24 Apr 2007 15:40:07 GMT]]></title><description><![CDATA[<p>boostA-G@nGSt@ schrieb:</p>
<blockquote>
<p>Ja klar.<br />
Anyway, ich möchte einfach einen scoped_ptr für HANDLE's. Geht das?</p>
</blockquote>
<p>Ein HANDLE ist kein Pointer. Dann ist es aber Unsinn, dafür scoped_ptr zu verwenden - von den technischen Schwierigkeiten mal ganz abgesehen, die sind nur sekundär. Welchen Sinn haben denn z.B. Operator* und -&gt; im Zusammenhang mit HANDLE? Was sinnvoll sein kann, ist sich an scoped_ptr anzulehnen und ein vergleichbares Ding zu benutzen: scoped_handle meinetwegen. Alles andere ist eine Vergewaltigung des Konzepts von scoped_ptr und mit Sicherheit keine gute Idee. also ungefähr</p>
<pre><code class="language-cpp">class scoped_handle : boost::noncopyable
{
public:
     explicit scoped_handle(HANDLE h = INVALID_HANDLE_VALUE) : h_( h ) {}
     ~scoped_ptr()
     {
         if ( h_ != INVALID_HANDLE_VALUE )
             CloseHandle( h_ );
     }

     void reset(HANDLE h = INVALID_HANDLE_VALUE)
     {
         if ( h_ != INVALID_HANDLE_VALUE )
             CloseHandle( h_ );
         h_ = h;
     }

     HANDLE get() const { return h_; }
     operator HANDLE() const { return get(); } // wenn man mag, muss man abwägen

     void swap(scoped_handle&amp; other)
     {
         using std::swap;
         swap( h_, other.h_ );
     }
private:
     HANDLE h_;
};

void swap(scoped_handle&amp; a, scoped_handle&amp; b) { a.swap( b ); }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1272567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272567</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 24 Apr 2007 15:40:07 GMT</pubDate></item><item><title><![CDATA[Reply to boost::checked_delete überladen? on Tue, 24 Apr 2007 15:52:26 GMT]]></title><description><![CDATA[<p>Nur so nebenbei... ihr prüft hier immer nur auf INVALID_HANDLE_VALUE. Euch ist schon klar dass es genügen Funktionen gibt die statt INVALID_HANDLE_VALUE einfach 0 zurückliefern wie z.B. CreateEvent, ja?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272583</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 24 Apr 2007 15:52:26 GMT</pubDate></item><item><title><![CDATA[Reply to boost::checked_delete überladen? on Tue, 24 Apr 2007 15:53:46 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Nur so nebenbei... ihr prüft hier immer nur auf INVALID_HANDLE_VALUE. Euch ist schon klar dass es genügen Funktionen gibt die statt INVALID_HANDLE_VALUE einfach 0 zurückliefern wie z.B. CreateEvent, ja?</p>
</blockquote>
<p>Natürlich. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272586</guid><dc:creator><![CDATA[TGGC|_work_]]></dc:creator><pubDate>Tue, 24 Apr 2007 15:53:46 GMT</pubDate></item><item><title><![CDATA[Reply to boost::checked_delete überladen? on Tue, 24 Apr 2007 15:56:04 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Nur so nebenbei... ihr prüft hier immer nur auf INVALID_HANDLE_VALUE. Euch ist schon klar dass es genügen Funktionen gibt die statt INVALID_HANDLE_VALUE einfach 0 zurückliefern wie z.B. CreateEvent, ja?</p>
</blockquote>
<p>Das mag so sein, ist hier aber irrelevant. Schließlich soll der OP hier nicht alles einfach übernehmen, sondern solche Sachen, die nicht spezifisch etwas mit C++ zu tun haben, selbst ausbügeln. Andernfalls ist das schlicht das falsche Forum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272588</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 24 Apr 2007 15:56:04 GMT</pubDate></item></channel></rss>