<?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[= Operator in Template Klassen Limitieren]]></title><description><![CDATA[<p>Ich habe einen Template Container mit einem = Operator. Das Kopieren eines Containers in einen anderen soll aber nur dann erlaubt sein wenn es sich nicht um Zeiger handelt. Mir ist dazu nur diese Lösung eingefallen.</p>
<pre><code class="language-cpp">template&lt;typename T_Type&gt;
class Container
{
private:

    template&lt;typename T_Allow&gt;
    class Allow
    {
    public:
        void allow()
        {};
    };

    template&lt;typename T_Allow&gt;
    class Allow&lt;T_Allow*&gt;
    {
    private:
        void allow()
        {
            #pragma message(&quot;operator= bei Zeigern nicht erlaubt&quot;)
        };
    };

public:

    Container&lt;T_Type&gt;&amp; operator=(const Container&lt;T_Type&gt; &amp;rhs)
    {
        Allow&lt;T_Type&gt;::allow();
        //Kopierarbeiten
    };
};
</code></pre>
<p>Gäbe es noch eine andere bzw bessere Lösung um beim Aufruf des = Operators für bestimte Typen direkt beim Compilen einen Fehler hervorzurufen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/258386/operator-in-template-klassen-limitieren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 10:00:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258386.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 10 Jan 2010 02:52:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to = Operator in Template Klassen Limitieren on Sun, 10 Jan 2010 02:52:36 GMT]]></title><description><![CDATA[<p>Ich habe einen Template Container mit einem = Operator. Das Kopieren eines Containers in einen anderen soll aber nur dann erlaubt sein wenn es sich nicht um Zeiger handelt. Mir ist dazu nur diese Lösung eingefallen.</p>
<pre><code class="language-cpp">template&lt;typename T_Type&gt;
class Container
{
private:

    template&lt;typename T_Allow&gt;
    class Allow
    {
    public:
        void allow()
        {};
    };

    template&lt;typename T_Allow&gt;
    class Allow&lt;T_Allow*&gt;
    {
    private:
        void allow()
        {
            #pragma message(&quot;operator= bei Zeigern nicht erlaubt&quot;)
        };
    };

public:

    Container&lt;T_Type&gt;&amp; operator=(const Container&lt;T_Type&gt; &amp;rhs)
    {
        Allow&lt;T_Type&gt;::allow();
        //Kopierarbeiten
    };
};
</code></pre>
<p>Gäbe es noch eine andere bzw bessere Lösung um beim Aufruf des = Operators für bestimte Typen direkt beim Compilen einen Fehler hervorzurufen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836023</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Sun, 10 Jan 2010 02:52:36 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator in Template Klassen Limitieren on Sun, 10 Jan 2010 08:36:09 GMT]]></title><description><![CDATA[<p>Xebov schrieb:</p>
<blockquote>
<p>Gäbe es noch eine andere bzw bessere Lösung um beim Aufruf des = Operators für bestimte Typen direkt beim Compilen einen Fehler hervorzurufen?</p>
</blockquote>
<p>Du verlässt Dich darauf, dass das pragma erst beim Instanziieren des Templates behandelt wird und nicht schon vorher. Das mag bei MSVC noch funktionieren, bei allen anderen Compilern wahrscheinlich nicht, da pragmas sowieso implementierungsabhängig sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836051</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 10 Jan 2010 08:36:09 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator in Template Klassen Limitieren on Sun, 10 Jan 2010 11:05:35 GMT]]></title><description><![CDATA[<p>Vergiss #pragma oder such dir ein anderes Unterforum aus.</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class AssignHelper {};

template &lt;typename T&gt;
class AssignHelper&lt;T*&gt;
{
private:
    void operator=(AssignHelper&amp;);
};

template&lt;typename T&gt;
class Container : AssignHelper&lt;T&gt;
{
};
</code></pre>
<p>Sofern der implizt deklarierte Zuweisungsoperator ausreicht.</p>
<p>Muss der Zuweisungsoperator selbst definiert werden, z.B. so</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class Container
{
    Container&amp; operator=(const Container&amp; rhs)
    {
        BOOST_STATIC_ASSERT( !boost::is_pointer&lt;T&gt;::value ); // oder
        int dummy[!boost::is_pointer&lt;T&gt;::value];dummy; // o.ä.
        ...
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1836130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836130</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 10 Jan 2010 11:05:35 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator in Template Klassen Limitieren on Sun, 10 Jan 2010 12:34:46 GMT]]></title><description><![CDATA[<p>Oder simpel mit boost::disavle_if :</p>
<pre><code class="language-cpp">template&lt;typename T_Type&gt;
class Container
{
public:

    boost::disable_if&lt;boost::is_pointer&lt;T_Type&gt;, Container&lt;T_Type&gt;&amp;&gt;::type //liefert Container&lt;T_Type&gt;&amp; falls T_Type kein Pointer ist, sonst Compilererror
    operator=(const Container&lt;T_Type&gt; &amp;rhs)
    {
        //Kopierarbeiten
    };
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1836188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836188</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 10 Jan 2010 12:34:46 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator in Template Klassen Limitieren on Sun, 10 Jan 2010 12:48:04 GMT]]></title><description><![CDATA[<p>Danke das disable_if sieht schon viel brauchbarer aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836203</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Sun, 10 Jan 2010 12:48:04 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator in Template Klassen Limitieren on Sun, 10 Jan 2010 14:45:59 GMT]]></title><description><![CDATA[<p>pumuckl, du brauchst hier noch ein <code>typename</code> :</p>
<pre><code class="language-cpp">// Benötigte Boost-Header
#include &lt;boost/utility/enable_if.hpp&gt;
#include &lt;boost/type_traits/is_pointer.hpp&gt;

template&lt;typename T_Type&gt; 
class Container 
{ 
public: 
    // hier
    typename boost::disable_if&lt;boost::is_pointer&lt;T_Type&gt;, Container&lt;T_Type&gt;&amp;&gt;::type
    operator=(const Container&lt;T_Type&gt; &amp;rhs) 
    { 

    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1836311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836311</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 10 Jan 2010 14:45:59 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator in Template Klassen Limitieren on Sun, 10 Jan 2010 15:09:45 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Oder simpel mit boost::disavle_if :</p>
</blockquote>
<p>Allerdings ist der Operator kein Template, also gibt es auch kein SFINAE. Eine Funktionstemplate wiederum verhindert nicht die implizite Deklaration der normalen Operatorfunktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836333</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 10 Jan 2010 15:09:45 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator in Template Klassen Limitieren on Sun, 10 Jan 2010 15:48:32 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Oder simpel mit boost::disavle_if :</p>
</blockquote>
<p>Allerdings ist der Operator kein Template, also gibt es auch kein SFINAE. Eine Funktionstemplate wiederum verhindert nicht die implizite Deklaration der normalen Operatorfunktion.</p>
</blockquote>
<p>und ich dachte immer Memberfunktionen und damit auch der op= von Klassentemplates sind automatisch auch Templates.<br />
MSVC schluckt das jedenfalls ohne zu meckern (was natürlich nicht unbedingt was heißt bei templates)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836349</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 10 Jan 2010 15:48:32 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator in Template Klassen Limitieren on Sun, 10 Jan 2010 18:36:17 GMT]]></title><description><![CDATA[<p>Danke für die Vorschläge hab mir alles mal angesehen. disable_if fällt für mich aus da ich lediglich den Copy Operator und Copy Construktor ausknipsen will für alle Zeiger Typen. Das Static_assert liefert schon ein ganz gutes Ergebniss. Schade nur das man einzellne Funktionen nicht einfach in Abhängigkeit der Parameter private/public machen kann.</p>
<p>camper schrieb:</p>
<blockquote>
<p>Vergiss #pragma oder such dir ein anderes Unterforum aus.</p>
</blockquote>
<p>Was hat pragma bitte mit nem anderen unterforum zu tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836463</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Sun, 10 Jan 2010 18:36:17 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator in Template Klassen Limitieren on Sun, 10 Jan 2010 18:58:48 GMT]]></title><description><![CDATA[<blockquote>
<p>The #pragma directives offer a way for each compiler to offer machine- and operating system-specific features [...] Pragmas are machine- or operating system-specific by definition, and are usually different for every compiler.</p>
</blockquote>
<p>(Quelle: MSDN)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836479</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 10 Jan 2010 18:58:48 GMT</pubDate></item><item><title><![CDATA[Reply to = Operator in Template Klassen Limitieren on Mon, 11 Jan 2010 05:41:27 GMT]]></title><description><![CDATA[<p>Hab das Problem jetzt mit Vererbung gelöst.</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class ContainerBase
{
protected:
    //ctor
    //copy ctor
    //= operator
};

template&lt;typename T&gt;
class Container:public ContainerBase&lt;T&gt;
{
public:
    //ctor
    //copy ctor
    //= operator
};

template&lt;typename T&gt;
class Container&lt;T*&gt;:public ContainerBase&lt;T*&gt;
{
private:
    //copy ctor
    //= operator
public:
    //ctor
};
</code></pre>
<p>Liefert genau das was ich wollte. Container mit Zeiegrn sind nicht kopierbar und die Fehlermeldungen sind etwas genauer als bei boost static_assert.</p>
<p>Danke nochmal an alle für die Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1836605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1836605</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Mon, 11 Jan 2010 05:41:27 GMT</pubDate></item></channel></rss>