<?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[Templatespezialisierung und Übernahme von Methoden]]></title><description><![CDATA[<p>Ich dachte immer eine Templatespezialisierung übernimmt die Methoden und Variablen in der allgemeinen Definition der Template-Klasse, aber anscheinend ist das nicht so.</p>
<p>Folgendes funktioniert nicht (mit vc7.1):</p>
<pre><code class="language-cpp">template&lt; int i &gt;
struct Vector
{
  void print( ostream&amp; out )
  {
     for( int j = 0; j &lt; i; ++j )
        out &lt;&lt; m[ j ] &lt;&lt; &quot;\t&quot;;
  }
  double m[ i ];
};

template&lt;&gt;
struct Vector&lt; 3 &gt;
{
  void crossP( const Vector&lt; 3 &gt;&amp; other )
  {
 	m[ 0 ] = m[ 1 ] * other.m[ 2 ] - m[ 2 ] * other.m[ 1 ];
	m[ 1 ] = m[ 2 ] * other.m[ 0 ] - m[ 0 ] * other.m[ 2 ];
	m[ 2 ] = m[ 0 ] * other.m[ 1 ] - m[ 1 ] * other.m[ 0 ];
  }

  //ohne das findet er m in vector&lt;3&gt; nicht
  double m[ 3 ];
};

vector&lt; 3 &gt; vec1, vec2;

vec1.crossP( vec2 ); //geht

vec1.print( cout ); //geht nicht, er findet print nicht
</code></pre>
<p>Das Beispiel soll nur das Problem wiedergeben.</p>
<p>Gibt es keine Möglichkeiten in der Spezialisierung die Methoden und Variablen aus der allgemeinen Definition zu übernehmen?<br />
Und wie steht es mit Überladungen in der Spezialisierung?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/144357/templatespezialisierung-und-übernahme-von-methoden</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 15:33:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/144357.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 17 Apr 2006 15:07:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templatespezialisierung und Übernahme von Methoden on Mon, 17 Apr 2006 15:07:21 GMT]]></title><description><![CDATA[<p>Ich dachte immer eine Templatespezialisierung übernimmt die Methoden und Variablen in der allgemeinen Definition der Template-Klasse, aber anscheinend ist das nicht so.</p>
<p>Folgendes funktioniert nicht (mit vc7.1):</p>
<pre><code class="language-cpp">template&lt; int i &gt;
struct Vector
{
  void print( ostream&amp; out )
  {
     for( int j = 0; j &lt; i; ++j )
        out &lt;&lt; m[ j ] &lt;&lt; &quot;\t&quot;;
  }
  double m[ i ];
};

template&lt;&gt;
struct Vector&lt; 3 &gt;
{
  void crossP( const Vector&lt; 3 &gt;&amp; other )
  {
 	m[ 0 ] = m[ 1 ] * other.m[ 2 ] - m[ 2 ] * other.m[ 1 ];
	m[ 1 ] = m[ 2 ] * other.m[ 0 ] - m[ 0 ] * other.m[ 2 ];
	m[ 2 ] = m[ 0 ] * other.m[ 1 ] - m[ 1 ] * other.m[ 0 ];
  }

  //ohne das findet er m in vector&lt;3&gt; nicht
  double m[ 3 ];
};

vector&lt; 3 &gt; vec1, vec2;

vec1.crossP( vec2 ); //geht

vec1.print( cout ); //geht nicht, er findet print nicht
</code></pre>
<p>Das Beispiel soll nur das Problem wiedergeben.</p>
<p>Gibt es keine Möglichkeiten in der Spezialisierung die Methoden und Variablen aus der allgemeinen Definition zu übernehmen?<br />
Und wie steht es mit Überladungen in der Spezialisierung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1039115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1039115</guid><dc:creator><![CDATA[Hugo R.]]></dc:creator><pubDate>Mon, 17 Apr 2006 15:07:21 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung und Übernahme von Methoden on Mon, 17 Apr 2006 15:42:51 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1039143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1039143</guid><dc:creator><![CDATA[l0l]]></dc:creator><pubDate>Mon, 17 Apr 2006 15:42:51 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung und Übernahme von Methoden on Tue, 18 Apr 2006 06:42:01 GMT]]></title><description><![CDATA[<p>Nein, eine Spezialisierung übernimmt nichts von der allgemeinen Klasse - schließlich könnte sich ja die Struktur der Daten verändert haben (was soll print() machen, wenn Vector&lt;3&gt; statt des Arrays drei einzelne double-Variablen verwendet?)</p>
<p>Du könntest höchstens eine Basisklasse definieren, die alle gemeinsamen Methoden enthält:</p>
<pre><code class="language-cpp">template&lt;int s&gt;
class Vec_base
{
public:
  ...
};

template&lt;int s&gt;
class Vector : public Vec_base&lt;s&gt; {};

template&lt;&gt;
class Vector&lt;3&gt; : public Vec_Base&lt;3&gt;
{
public:
  void crossP(const Vector&lt;3&gt;&amp; other) {...}
  ...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1039466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1039466</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 18 Apr 2006 06:42:01 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung und Übernahme von Methoden on Tue, 18 Apr 2006 10:39:30 GMT]]></title><description><![CDATA[<p>es spricht nichts dagegen, diese funktion bereits im primären template zu deklarieren. sie muss lediglich so geschrieben werden, dass der versuch, sie für andere template parameter zu instantiieren, fehlschlagen muss. z.b.:</p>
<pre><code class="language-cpp">template&lt; int i &gt;
struct Vector
{
  void print( ostream&amp; out )
  {
     for( int j = 0; j &lt; i; ++j )
        out &lt;&lt; m[ j ] &lt;&lt; &quot;\t&quot;;
  }
  void crossP( const Vector&amp; other )
  {
     1 / ( i == 3 );
     m[ 0 ] = m[ 1 ] * other.m[ 2 ] - m[ 2 ] * other.m[ 1 ];
     m[ 1 ] = m[ 2 ] * other.m[ 0 ] - m[ 0 ] * other.m[ 2 ];
     m[ 2 ] = m[ 0 ] * other.m[ 1 ] - m[ 1 ] * other.m[ 0 ];
  }
  double m[ i ];
};
</code></pre>
<p>dieses vorgehen hat allerdings den nachteil, dass der fehler an der logisch falschen stelle entsteht, nähmlich innerhalb der funktion, und nicht dort, wo fälschlicherweise versucht wird, die funktion mit dem falschen parametern zu instantiieren. ebenso verhindert diese methode das explizite instatntiieren des templates. ein ausweg daraus bietet SFINAE, allerdings müssen wir die funktion dafür in ein template wandeln, also noch irgendwie einen templateparameter einführen und zwar so, dass er aus den funktionsargumenten ermittelt werden kann:</p>
<pre><code class="language-cpp">template&lt; bool b &gt; struct enable_if {};
template&lt;&gt; struct enable_if&lt; true &gt; { typedef void type; };
template&lt; int i &gt;
struct Vector
{
  void print( ostream&amp; out )
  {
     for( int j = 0; j &lt; i; ++j )
        out &lt;&lt; m[ j ] &lt;&lt; &quot;\t&quot;;
  }
  template&lt; int j &gt;
  void crossP( const Vector&lt; j &gt;&amp; other, typename enable_if&lt; i == 3 &amp;&amp; j == 3 &gt;::type* = 0 )
  {
     m[ 0 ] = m[ 1 ] * other.m[ 2 ] - m[ 2 ] * other.m[ 1 ];
     m[ 1 ] = m[ 2 ] * other.m[ 0 ] - m[ 0 ] * other.m[ 2 ];
     m[ 2 ] = m[ 0 ] * other.m[ 1 ] - m[ 1 ] * other.m[ 0 ];
  }
  double m[ i ];
};
</code></pre>
<p>mit boost würde das enable_if_c sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1039664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1039664</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 18 Apr 2006 10:39:30 GMT</pubDate></item><item><title><![CDATA[Reply to Templatespezialisierung und Übernahme von Methoden on Tue, 18 Apr 2006 13:20:12 GMT]]></title><description><![CDATA[<p>Ah Danke, auf SFINAE bin ich gar nicht gekommen, aber das ist für mein Fall genau das was ich brauche, 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/1039826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1039826</guid><dc:creator><![CDATA[Hugo R.]]></dc:creator><pubDate>Tue, 18 Apr 2006 13:20:12 GMT</pubDate></item></channel></rss>