<?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[Spezilisierung von onstruktor Templates?]]></title><description><![CDATA[<p>Hallo alle zusammen. Ich hab grad ein etwas spezielles Problemchen, bezueglich eines Konstruktor templates:</p>
<pre><code class="language-cpp">class Digsda
{
public:
  template &lt;typename T&gt;
  Dingsda(const T&amp; rhs);
// usw.
};
</code></pre>
<p>Die Klasse an sich ist also kein Template, nur der Konsturktor soll eins sein.<br />
Diesen will ich nun fuer bestimmte Klassen spezialisieren, z.B. als Copy-CTOR. Wie sieht da die genaue Syntax aus?</p>
<pre><code class="language-cpp">template&lt;&gt;
 Dingsda::Dingsda&lt;Dingsda&gt;(const Dingsda&amp; rhs) 
  {
   // specific copy ctor code here
  }

template&lt;&gt;
 Dingsda::Dingsda&lt;float&gt;(const float&amp; rhs)
  {
   // float code here
  }
</code></pre>
<p>ist das so korrekt oder produzier ich da voelligen bloedsinn mit? meinen Buecher zufolge sollte template Spezialisierung etwa so aussehen...</p>
<p>Ich moechte mir auf die Art die Verwendung sicherstellen, da meines Wissens templates keine implizite Typkonvertierung erlauben. Denn mit einem Code a la</p>
<pre><code class="language-cpp">class Dingsda
{
public:
  Dingsda(const float&amp; rhs);
  Dingsda(const Dingsda&amp; rhs);
//etc.
};
</code></pre>
<p>ist folgendes moeglich:</p>
<pre><code class="language-cpp">int main()
{
  int i = 3;
  Dingsda dings(i);  // i wird implizit nach float konvertiert
}
</code></pre>
<p>mit templates kann ich sowas unterbinden, wenn keine Spezialisierung fuer int vorhanden ist. Oder hab ich was uebersehn?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/185182/spezilisierung-von-onstruktor-templates</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 02:52:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/185182.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 22 Jun 2007 13:44:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Spezilisierung von onstruktor Templates? on Fri, 22 Jun 2007 13:44:00 GMT]]></title><description><![CDATA[<p>Hallo alle zusammen. Ich hab grad ein etwas spezielles Problemchen, bezueglich eines Konstruktor templates:</p>
<pre><code class="language-cpp">class Digsda
{
public:
  template &lt;typename T&gt;
  Dingsda(const T&amp; rhs);
// usw.
};
</code></pre>
<p>Die Klasse an sich ist also kein Template, nur der Konsturktor soll eins sein.<br />
Diesen will ich nun fuer bestimmte Klassen spezialisieren, z.B. als Copy-CTOR. Wie sieht da die genaue Syntax aus?</p>
<pre><code class="language-cpp">template&lt;&gt;
 Dingsda::Dingsda&lt;Dingsda&gt;(const Dingsda&amp; rhs) 
  {
   // specific copy ctor code here
  }

template&lt;&gt;
 Dingsda::Dingsda&lt;float&gt;(const float&amp; rhs)
  {
   // float code here
  }
</code></pre>
<p>ist das so korrekt oder produzier ich da voelligen bloedsinn mit? meinen Buecher zufolge sollte template Spezialisierung etwa so aussehen...</p>
<p>Ich moechte mir auf die Art die Verwendung sicherstellen, da meines Wissens templates keine implizite Typkonvertierung erlauben. Denn mit einem Code a la</p>
<pre><code class="language-cpp">class Dingsda
{
public:
  Dingsda(const float&amp; rhs);
  Dingsda(const Dingsda&amp; rhs);
//etc.
};
</code></pre>
<p>ist folgendes moeglich:</p>
<pre><code class="language-cpp">int main()
{
  int i = 3;
  Dingsda dings(i);  // i wird implizit nach float konvertiert
}
</code></pre>
<p>mit templates kann ich sowas unterbinden, wenn keine Spezialisierung fuer int vorhanden ist. Oder hab ich was uebersehn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311539</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 22 Jun 2007 13:44:00 GMT</pubDate></item><item><title><![CDATA[Reply to Spezilisierung von onstruktor Templates? on Fri, 22 Jun 2007 14:03:45 GMT]]></title><description><![CDATA[<p>naja der sinn von templates ist eingentlich der das man sowenig wie möglich spezialisiert.</p>
<p>für alles andere kann man normale überladene funktionen (in dem fall konstruktoren) schreiben (wo auch implizite typenkonvertierung funktioniert, oder nicht wenn man explizit angibt).</p>
<pre><code class="language-cpp">class Dingsda
{
public:
  template &lt;typename T&gt;
  Dingsda(T const&amp; rhs);

  Dingsda(float rhs);
  Dingsda(Dingsda const&amp; rhs);
};

template &lt;typename T&gt;
Dingsda::Dingsda(T const&amp; rhs)
{
 //generische implementation
}

template &lt;&gt;
Dingsda::Dingsda&lt;char&gt; (char const&amp; rhs)
{
 //template spezialisierung (erlaubt keine implizite konstrution)
}

Dingsda::Dingsda(float rhs)
{
 //spezifische implementation (durch überladung, erlaubt implizites konstruieren)
}

Dingsda::Dingsda(Dingsda const&amp; rhs)
{
 //genauso wie oben
}

int main(int, char**)
{
 Dingsda f(1); // Dingsda::Dingsda(float)
 Dingsda d(f); // Dingsda::Dingsda(Dingsda const&amp;)
 Dingsda c('c'); //Dingsda::Dingsda&lt;char&gt;(char const&amp;)

 IrgendEineKlasse c;

 Dingsda ic(c); //Dingsda::Dingsda&lt;T&gt;(T const&amp;) 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1311556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311556</guid><dc:creator><![CDATA[inp]]></dc:creator><pubDate>Fri, 22 Jun 2007 14:03:45 GMT</pubDate></item><item><title><![CDATA[Reply to Spezilisierung von onstruktor Templates? on Fri, 22 Jun 2007 14:07:48 GMT]]></title><description><![CDATA[<p>Besser ist es du nimmst überhaupt keine templates und überlädst die Konstruktoren direkt. Um dieimplizite Typkonvertierung zu unterbinden, gibt es das Schlüsselwort 'explicit':</p>
<pre><code class="language-cpp">class Dingsda
{
public:
  explicit Dingsda(float rhs);
  explicit Dingsda(Dingsda const&amp; rhs);
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1311558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311558</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Fri, 22 Jun 2007 14:07:48 GMT</pubDate></item><item><title><![CDATA[Reply to Spezilisierung von onstruktor Templates? on Fri, 22 Jun 2007 14:46:14 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<p>Besser ist es du nimmst überhaupt keine templates und überlädst die Konstruktoren direkt. Um dieimplizite Typkonvertierung zu unterbinden, gibt es das Schlüsselwort 'explicit':</p>
<pre><code class="language-cpp">class Dingsda
{
public:
  explicit Dingsda(float rhs);
  explicit Dingsda(Dingsda const&amp; rhs);
};
</code></pre>
</blockquote>
<p>Das würde leider bei einem Aufruf wie:</p>
<pre><code class="language-cpp">Dingsda dings(6);
</code></pre>
<p>nicht helfen, da der Compiler sowas draus macht:</p>
<pre><code class="language-cpp">Dingsda dings( /*Dingsda(float)-&gt;*/Dingsda(6)/*Dingsda(copy)*/ );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1311584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311584</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 22 Jun 2007 14:46:14 GMT</pubDate></item><item><title><![CDATA[Reply to Spezilisierung von onstruktor Templates? on Fri, 22 Jun 2007 14:47:16 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Konstruktor templates</p>
</blockquote>
<p>Sowas nennt man auch gerne &quot;Typumwandlungskonstruktor&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311586</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 22 Jun 2007 14:47:16 GMT</pubDate></item><item><title><![CDATA[Reply to Spezilisierung von onstruktor Templates? on Fri, 22 Jun 2007 15:02:05 GMT]]></title><description><![CDATA[<p>inp schrieb:</p>
<blockquote>
<pre><code class="language-cpp">...
</code></pre>
</blockquote>
<p>Seltsam <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=":confused:"
      alt="😕"
    /> Wieso schluckt das mein gcc nicht ?<br />
Ihm gefällt das hier nicht:</p>
<pre><code class="language-cpp">Dingsda::Dingsda&lt;char&gt;
</code></pre>
<p>Fragt sich anscheinend wieso Dingsda kein Klassentemplate ist, obwohl dann das &lt;..&gt; ja hinterm ersten Dingsda sein müsste ...</p>
<p>Aber Comeau meckert nicht, dann ist ja alles gut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311604</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 22 Jun 2007 15:02:05 GMT</pubDate></item><item><title><![CDATA[Reply to Spezilisierung von onstruktor Templates? on Fri, 22 Jun 2007 17:01:22 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p>Th schrieb:</p>
<blockquote>
<p>Besser ist es du nimmst überhaupt keine templates und überlädst die Konstruktoren direkt. Um dieimplizite Typkonvertierung zu unterbinden, gibt es das Schlüsselwort 'explicit':</p>
<pre><code class="language-cpp">class Dingsda
{
public:
  explicit Dingsda(float rhs);
  explicit Dingsda(Dingsda const&amp; rhs);
};
</code></pre>
</blockquote>
<p>Das würde leider bei einem Aufruf wie:</p>
<pre><code class="language-cpp">Dingsda dings(6);
</code></pre>
<p>nicht helfen, da der Compiler sowas draus macht:</p>
<pre><code class="language-cpp">Dingsda dings( /*Dingsda(float)-&gt;*/Dingsda(6)/*Dingsda(copy)*/ );
</code></pre>
</blockquote>
<p>das seh ich anders</p>
<pre><code class="language-cpp">class Dingsda
{
public:
  explicit Dingsda(float rhs);
  explicit Dingsda(Dingsda const&amp; rhs);
};
...
Dingsda dings(6);
</code></pre>
<p>da der ctor float definiert ist wird nur dieser ctor aufgerufen<br />
davor wird int zu float gecastet.</p>
<p>explizit wird eigentlich verwendet um soetwas zu verhindern</p>
<pre><code class="language-cpp">class Dingsda3;
class Dingsda2;

class Dingsda
{
	float m_f;
public:
	explicit Dingsda(float) : m_f(0) 
	{ }

	/* explicit */ Dingsda(Dingsda const&amp; other) : m_f(other.m_f)
	{ }

	/* explicit */ Dingsda(Dingsda3 const&amp;) {};
};

class Dingsda2
{
	float m_f;
public:
	Dingsda2() : m_f(1.0f)
	{ };

	operator Dingsda()
	{	return Dingsda(m_f);	//expliziter aufruf Dingsda::Dingsda(float)
	}
};

class Dingsda3
{
public:
	Dingsda3(int) {};
};

int main(int, char**)
{
	Dingsda d(Dingsda2);	// error : wenn Dingsda::Dingsda(Dingsda const&amp;) als explizit definiert
							// ansonsten : explizit Dingsda2::Dingsda2(), implizit static_cast&lt;Dingsda&gt;(exlizit kreirtes dingsda2), impliziter Dingsda(Dingsda const&amp;) aufruf

	Dingsda d2 = 1;			// error : wenn Dingsda::Dingsda(Dingsda3 const&amp;) als explizit definiert
							// ansonsten : geht nicht über Dingsda::Dingsda(float) da als explizit definiert
							// sondern implizit Dingsda3::Dingsda3(int), implizit Dingsda::Dingsda(Dingsda3 const&amp;)

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1311664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311664</guid><dc:creator><![CDATA[inp]]></dc:creator><pubDate>Fri, 22 Jun 2007 17:01:22 GMT</pubDate></item><item><title><![CDATA[Reply to Spezilisierung von onstruktor Templates? on Fri, 22 Jun 2007 16:39:42 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p>inp schrieb:</p>
<blockquote>
<pre><code class="language-cpp">...
</code></pre>
</blockquote>
<p>Seltsam <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=":confused:"
      alt="😕"
    /> Wieso schluckt das mein gcc nicht ?<br />
Ihm gefällt das hier nicht:</p>
<pre><code class="language-cpp">Dingsda::Dingsda&lt;char&gt;
</code></pre>
<p>Fragt sich anscheinend wieso Dingsda kein Klassentemplate ist, obwohl dann das &lt;..&gt; ja hinterm ersten Dingsda sein müsste ...</p>
<p>Aber Comeau meckert nicht, dann ist ja alles gut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>hmmh, hast recht (vs2005 auch)<br />
die syntax kommt mir richtig vor<br />
ich hab hab &lt;char&gt; weggetan damit der compiler den typen automatisch rausfindet.<br />
so lässts sich kompilieren.</p>
<pre><code class="language-cpp">template&lt;&gt;
Dingsda::Dingsda(char const&amp;)
{ }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1311671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311671</guid><dc:creator><![CDATA[inp]]></dc:creator><pubDate>Fri, 22 Jun 2007 16:39:42 GMT</pubDate></item><item><title><![CDATA[Reply to Spezilisierung von onstruktor Templates? on Fri, 22 Jun 2007 17:11:01 GMT]]></title><description><![CDATA[<p>inp schrieb:</p>
<blockquote>
<p>KasF schrieb:</p>
<blockquote>
<p>Th schrieb:</p>
<blockquote>
<p>Besser ist es du nimmst überhaupt keine templates und überlädst die Konstruktoren direkt. Um dieimplizite Typkonvertierung zu unterbinden, gibt es das Schlüsselwort 'explicit':</p>
<pre><code class="language-cpp">class Dingsda
{
public:
  explicit Dingsda(float rhs);
  explicit Dingsda(Dingsda const&amp; rhs);
};
</code></pre>
</blockquote>
<p>Das würde leider bei einem Aufruf wie:</p>
<pre><code class="language-cpp">Dingsda dings(6);
</code></pre>
<p>nicht helfen, da der Compiler sowas draus macht:</p>
<pre><code class="language-cpp">Dingsda dings( /*Dingsda(float)-&gt;*/Dingsda(6)/*Dingsda(copy)*/ );
</code></pre>
</blockquote>
<p>das seh ich anders</p>
<pre><code class="language-cpp">class Dingsda
{
public:
  explicit Dingsda(float rhs);
  explicit Dingsda(Dingsda const&amp; rhs);
};
...
Dingsda dings(6);
</code></pre>
<p>da der ctor float definiert ist wird nur dieser ctor aufgerufen<br />
davor wird int zu float gecastet.</p>
</blockquote>
<p>Hrmpf, hast natürlich vollkommen Recht. In letzter Zeit schreibe ich immer viel Unsinn. Sollte besser mal meine Post's genauer lesen <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="🙂"
    /><br />
Mir ist auch natürlich klar was es mit explicit auf sich hat.</p>
<p>Trotzdem hilft hier die Lösung von Th nicht, um die Konvertierung von int to float zu verhindern ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311692</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 22 Jun 2007 17:11:01 GMT</pubDate></item><item><title><![CDATA[Reply to Spezilisierung von onstruktor Templates? on Fri, 22 Jun 2007 17:29:33 GMT]]></title><description><![CDATA[<p>das stimmt</p>
<p>alternativ kann man den &quot;int&quot; konstruktor private definieren, somit gibts ihn für einen typen (und keine impliziten spielchen werden probiert) da er im private bereich ist kann man ihn nicht ausführen.</p>
<p>so:</p>
<pre><code class="language-cpp">class Dingsda
{
public:
 Dingsda(float) {};

private:
 Dingsda(int) {}; //speziell für einen typen konstruktion abdrehen

 Dingsda(Dingsda const&amp;) {}; // template&lt;typename T&gt; beinhaltet copy construktor nicht, wenn nicht vorhanden wird er generiert !!!!

 template&lt;typename T&gt;
 Dingsda(T const&amp;) {}; //für alle typen konstrkution abdrehen, ausnahme die public definierten nicht &quot;template basierten&quot; konstrkutoren 
};

int main(int, char**)
{ 
 Dingsda d(1), //error , private Dingsda(int)
		 d2 = 2; //error , private Dingsda(int)

 Dingsda d(1.0), //error , private template&lt;typename T&gt; Dingsda(T)
	     d2 = 2.0; //error , private template&lt;typename T&gt; Dingsda(T)

 Dingsda f(1.0f), //ok
	     f2 = 2.0f; //ok

 Dingsda c = f; //error , private Dingsda(Dingsda const&amp;)
		 c2 = f2; //error , private Dingsda(Dingsda const&amp;)

 return 0;
}
</code></pre>
<p>die regeln hierfür, soweit ich mich erinnern kann</p>
<ol>
<li>schauen ob konstruktor auf direktem wege gefunden wird</li>
<li>schauen ob konstruktor durch templates gefunden wird (ausgenommen copykonstruktor mit eigenem typen)</li>
<li>schauen ob konstruktor auf indirektem wege gefunden wird (durch implizites herumgecaste (aber nicht 10000mal hintereinander, sondern maximal 1mal))</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1311698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311698</guid><dc:creator><![CDATA[inp]]></dc:creator><pubDate>Fri, 22 Jun 2007 17:29:33 GMT</pubDate></item><item><title><![CDATA[Reply to Spezilisierung von onstruktor Templates? on Fri, 22 Jun 2007 17:39:54 GMT]]></title><description><![CDATA[<p>Die Konstruktion mit bestimmten Argumenten zu verhindern ist ja kein schweres Ding.<br />
Ich hatte es eher so verstanden, dass pumuckl für bestimmte Typen, bestimmte Konstruktoren aufrufen will, aber dennoch grundlegende Konvertierung wie int to float verhindern wollte ...</p>
<p>Dazu fällt mir aber auch keine andere Methode ein, wie die mit Templates von dir.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311715</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 22 Jun 2007 17:39:54 GMT</pubDate></item><item><title><![CDATA[Reply to Spezilisierung von onstruktor Templates? on Fri, 22 Jun 2007 19:00:29 GMT]]></title><description><![CDATA[<p>inp schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Dingsda f(1.0f), //ok
	     f2 = 2.0f; //ok
</code></pre>
</blockquote>
<p>nicht ganz. Für f2 brauchen wir einen Copy-Konstruktor - auch dann, wenn dieser ausgelassen wird. Im Übrigen ist es zweckmäßig, diese privaten Konstruktoren nicht zu definieren, um auch dann, wenn wir es mit friends oder Funktionen der Klasse zu tun haben, wenigstens einen Linkerfehler zu erhalten.</p>
<p>Ein andere Methode bedient sich SFINAE um unerwünschte Spezialisierungen zu unterdrücken bzw. erwünschte zuzulassen (geht auch ohne boost - aber so ist es einfacher)</p>
<pre><code class="language-cpp">#include &quot;boost/utility.hpp&quot;
#include &quot;boost/mpl/vector.hpp&quot;
#include &lt;boost/mpl/contains.hpp&gt;

namespace mpl = boost::mpl;

class Dingsda // : boost::noncopyable
{
public:
    template&lt;typename T&gt;
    Dingsda(const T&amp; t,
        typename boost::disable_if&lt; typename mpl::contains&lt; mpl::vector&lt;
            int, char, void*, float, double                  // Für alle Typen außer den aufgezählten
        &gt;, T &gt;::type &gt;::type* = 0) {}

    template&lt;typename T&gt;
    Dingsda(const T&amp; t,
        typename boost::enable_if&lt; typename mpl::contains&lt; mpl::vector&lt;
            float                                            // Für alle aufgezählten Typen
        &gt;, T &gt;::type &gt;::type* = 0) {}

private:
    Dingsda(Dingsda&amp;);
    void operator=(Dingsda&amp;);
};

int main(int, char**)
{
 Dingsda d(1), //error, kann nicht in Dingsda&amp; konvertieren
         d2 = 2; //error, kann nicht in Dingsda&amp; konvertieren

 Dingsda e(1.0), //error, kann nicht in Dingsda&amp; konvertieren
         e2 = 2.0; //error, kann nicht in Dingsda&amp; konvertieren

 Dingsda f(1.0f), //ok
         f2 = 2.0f; //fehler, kann rvalue nicht an referenz binden

 Dingsda c = f; //error , private Dingsda(Dingsta&amp;)

 return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1311761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311761</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 22 Jun 2007 19:00:29 GMT</pubDate></item><item><title><![CDATA[Reply to Spezilisierung von onstruktor Templates? on Fri, 22 Jun 2007 21:43:37 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>inp schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Dingsda f(1.0f), //ok
	     f2 = 2.0f; //ok
</code></pre>
</blockquote>
<p>nicht ganz. Für f2 brauchen wir einen Copy-Konstruktor - auch dann, wenn dieser ausgelassen wird. Im Übrigen ist es zweckmäßig, diese privaten Konstruktoren nicht zu definieren, um auch dann, wenn wir es mit friends oder Funktionen der Klasse zu tun haben, wenigstens einen Linkerfehler zu erhalten.</p>
<p>Ein andere Methode bedient sich SFINAE um unerwünschte Spezialisierungen zu unterdrücken bzw. erwünschte zuzulassen (geht auch ohne boost - aber so ist es einfacher)</p>
<pre><code class="language-cpp">#include &quot;boost/utility.hpp&quot;
#include &quot;boost/mpl/vector.hpp&quot;
#include &lt;boost/mpl/contains.hpp&gt;

namespace mpl = boost::mpl;

class Dingsda // : boost::noncopyable
{
public:
    template&lt;typename T&gt;
    Dingsda(const T&amp; t,
        typename boost::disable_if&lt; typename mpl::contains&lt; mpl::vector&lt;
            int, char, void*, float, double                  // Für alle Typen außer den aufgezählten
        &gt;, T &gt;::type &gt;::type* = 0) {}

    template&lt;typename T&gt;
    Dingsda(const T&amp; t,
        typename boost::enable_if&lt; typename mpl::contains&lt; mpl::vector&lt;
            float                                            // Für alle aufgezählten Typen
        &gt;, T &gt;::type &gt;::type* = 0) {}

private:
    Dingsda(Dingsda&amp;);
    void operator=(Dingsda&amp;);
};

int main(int, char**)
{
 Dingsda d(1), //error, kann nicht in Dingsda&amp; konvertieren
         d2 = 2; //error, kann nicht in Dingsda&amp; konvertieren

 Dingsda e(1.0), //error, kann nicht in Dingsda&amp; konvertieren
         e2 = 2.0; //error, kann nicht in Dingsda&amp; konvertieren

 Dingsda f(1.0f), //ok
         f2 = 2.0f; //fehler, kann rvalue nicht an referenz binden

 Dingsda c = f; //error , private Dingsda(Dingsta&amp;)

 return 0;
}
</code></pre>
</blockquote>
<p>yup <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="🙂"
    /><br />
wollt die schweren geschütze nicht ausfahren <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="😃"
    /></p>
<p>mit template meta kann man sich aber auch unnötig viel spielen <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="😃"
    /></p>
<p>edit:<br />
das mit undefiniertem body leuchtet ein, ty für tip.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311836</guid><dc:creator><![CDATA[inp]]></dc:creator><pubDate>Fri, 22 Jun 2007 21:43:37 GMT</pubDate></item><item><title><![CDATA[Reply to Spezilisierung von onstruktor Templates? on Sat, 23 Jun 2007 09:18:57 GMT]]></title><description><![CDATA[<p>Naja, das mit boost erscheint mir bissl overkill. Wenn ich (neben dem Copy-Ctor) das Konstruktor template wie oben von mir geschrieben deklariere, aber abgesehen von den drei oder vier Spezialisierungen für die Typen die ich zulassen will keine allgemeine Definition liefere, wird er mir auf jeden Fall schon zur Compilezeit Linkerfehler geben, falls ich das mit nem falschen Typ versuche oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311973</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sat, 23 Jun 2007 09:18:57 GMT</pubDate></item></channel></rss>