<?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[Klassentemplates über Dateigrenzen]]></title><description><![CDATA[<p><strong>Problem</strong></p>
<p>Der nachfolgende Code lässt sich nicht linken.</p>
<p><strong>Erklärung</strong></p>
<p>Ich versuche eine Klasse a_c zu bauen, die Daten verwaltet (noch leer), welche anschliessend von zwei Instanzen der Klassentemplates a_func_c benutzt werden. Während die Funktionen von a_c alle inline in a.h stehen, sollen die Funktionsdefinitionen der Members von a_func_c in a.cpp definiert sein (wichtig).</p>
<p><strong>Denkfehler?</strong></p>
<p>Ich gehe davon aus, dass mit der Definition von a in main() auch gleich die beiden Klassentemplates w und b als Membervariable der Klasse a_c angelegt werden. Wo ist mein Fehler?</p>
<p><strong>main.cpp</strong></p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &quot;a.h&quot;

int main()
{
  a_c a;

  printf_s(&quot;%d\n&quot;, a.foo(0));

  return 0;
}
</code></pre>
<p><strong>a.h</strong></p>
<pre><code class="language-cpp">#ifndef A_H
#define A_H

template&lt;int M, int Y&gt;
class a_func_c {
  friend class a_c;

private:
  int foo() const;
};

class a_c {
private:
  a_func_c&lt;0, 1&gt; w;
  a_func_c&lt;1, 0&gt; b;

public:
  int foo(int stm) const;
};

inline int a_c::foo(int stm) const {
  return (stm == 0) ? w.foo() : b.foo();
}

#endif
</code></pre>
<p><strong>a.cpp</strong></p>
<pre><code class="language-cpp">#include &quot;a.h&quot;

template&lt;int M, int Y&gt;
int a_func_c&lt;M, Y&gt;::foo() const {
  return 2*M + 4*Y;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/265779/klassentemplates-über-dateigrenzen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 18:27:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/265779.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 28 Apr 2010 16:28:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassentemplates über Dateigrenzen on Wed, 28 Apr 2010 16:33:31 GMT]]></title><description><![CDATA[<p><strong>Problem</strong></p>
<p>Der nachfolgende Code lässt sich nicht linken.</p>
<p><strong>Erklärung</strong></p>
<p>Ich versuche eine Klasse a_c zu bauen, die Daten verwaltet (noch leer), welche anschliessend von zwei Instanzen der Klassentemplates a_func_c benutzt werden. Während die Funktionen von a_c alle inline in a.h stehen, sollen die Funktionsdefinitionen der Members von a_func_c in a.cpp definiert sein (wichtig).</p>
<p><strong>Denkfehler?</strong></p>
<p>Ich gehe davon aus, dass mit der Definition von a in main() auch gleich die beiden Klassentemplates w und b als Membervariable der Klasse a_c angelegt werden. Wo ist mein Fehler?</p>
<p><strong>main.cpp</strong></p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &quot;a.h&quot;

int main()
{
  a_c a;

  printf_s(&quot;%d\n&quot;, a.foo(0));

  return 0;
}
</code></pre>
<p><strong>a.h</strong></p>
<pre><code class="language-cpp">#ifndef A_H
#define A_H

template&lt;int M, int Y&gt;
class a_func_c {
  friend class a_c;

private:
  int foo() const;
};

class a_c {
private:
  a_func_c&lt;0, 1&gt; w;
  a_func_c&lt;1, 0&gt; b;

public:
  int foo(int stm) const;
};

inline int a_c::foo(int stm) const {
  return (stm == 0) ? w.foo() : b.foo();
}

#endif
</code></pre>
<p><strong>a.cpp</strong></p>
<pre><code class="language-cpp">#include &quot;a.h&quot;

template&lt;int M, int Y&gt;
int a_func_c&lt;M, Y&gt;::foo() const {
  return 2*M + 4*Y;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1889568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889568</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Wed, 28 Apr 2010 16:33:31 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplates über Dateigrenzen on Wed, 28 Apr 2010 16:31:08 GMT]]></title><description><![CDATA[<p>Lösung:</p>
<p>Alles in die &gt;Headerdatei schreiben. Im aktuellen C++ Standard nicht anders möglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889570</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Wed, 28 Apr 2010 16:31:08 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplates über Dateigrenzen on Wed, 28 Apr 2010 16:35:42 GMT]]></title><description><![CDATA[<p>Tatsächlich? Heisst das, dass ich die Sourcedatei am Ende der Header includieren muss?</p>
<p>Es gibt noch eine Lösung via Metaprogrammierung mit Präprozessor. Gefällt mir aber nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889573</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Wed, 28 Apr 2010 16:35:42 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplates über Dateigrenzen on Wed, 28 Apr 2010 16:36:48 GMT]]></title><description><![CDATA[<p>Du musst die Definitionen in die Header Datei schreiben und am Ende die Header Datei inkludieren, dort wo du das Template benötigst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889574</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Wed, 28 Apr 2010 16:36:48 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplates über Dateigrenzen on Wed, 28 Apr 2010 16:41:30 GMT]]></title><description><![CDATA[<p>Ja, so gehts.</p>
<p>Gibt es überhaupt keine Möglichkeit über Dateigrenzen (ohne in der Header zu definieren) Templates zu bauen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889578</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Wed, 28 Apr 2010 16:41:30 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplates über Dateigrenzen on Wed, 28 Apr 2010 16:58:55 GMT]]></title><description><![CDATA[<p>Nicht im aktuellen C++ Standard. Im neuen, C++0x (x ist eine HexZiffer ;)) Standard wird es möglich sein. Der wird voraussichtlich in 1-2 Jahren fertig und implementiert sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889588</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Wed, 28 Apr 2010 16:58:55 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplates über Dateigrenzen on Wed, 28 Apr 2010 17:52:53 GMT]]></title><description><![CDATA[<p>Tomahawk schrieb:</p>
<blockquote>
<p>Tatsächlich? Heisst das, dass ich die Sourcedatei am Ende der Header includieren muss?</p>
</blockquote>
<p>Ja, aber keine .cpp-Datei, denn die wird kompiliert. Nimm .inl, .ipp, .impl, .h oder .hpp.</p>
<p>Tomahawk schrieb:</p>
<blockquote>
<p>Es gibt noch eine Lösung via Metaprogrammierung mit Präprozessor. Gefällt mir aber nicht.</p>
</blockquote>
<p>Hier kommst du aber auch nicht drum herum, alles in den Header zu schreiben.</p>
<p>Janjan schrieb:</p>
<blockquote>
<p>Nicht im aktuellen C++ Standard. Im neuen, C++0x (x ist eine HexZiffer ;)) Standard wird es möglich sein.</p>
</blockquote>
<p>Bist du sicher? Auf welches Feature spielst du an?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889620</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 28 Apr 2010 17:52:53 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplates über Dateigrenzen on Thu, 29 Apr 2010 05:17:55 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Janjan schrieb:</p>
<blockquote>
<p>Nicht im aktuellen C++ Standard. Im neuen, C++0x (x ist eine HexZiffer ;)) Standard wird es möglich sein.</p>
</blockquote>
<p>Bist du sicher? Auf welches Feature spielst du an?</p>
</blockquote>
<p>Sicherlich auf das</p>
<pre><code class="language-cpp">export template
</code></pre>
<p>Siehe folgenden Link:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889776</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Thu, 29 Apr 2010 05:17:55 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplates über Dateigrenzen on Thu, 29 Apr 2010 05:34:41 GMT]]></title><description><![CDATA[<p><strong>MSDN 2008</strong><br />
The export keyword is not supported on templates.</p>
<p>Dann halt alles innerhalb derselben Sources implementieren und externe Schnittstellen bauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889778</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Thu, 29 Apr 2010 05:34:41 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplates über Dateigrenzen on Thu, 29 Apr 2010 05:58:14 GMT]]></title><description><![CDATA[<p>Janjan schrieb:</p>
<blockquote>
<p>Im aktuellen C++ Standard nicht anders möglich.</p>
</blockquote>
<p>Im Standard schon, der definiert das Keyword export. Das wird allerdings von fast keinem Compiler uterstützt. -&gt; &quot;Mit aktuellen C++ Compilern nicht anders möglich&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1889784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1889784</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 29 Apr 2010 05:58:14 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplates über Dateigrenzen on Thu, 29 Apr 2010 18:19:42 GMT]]></title><description><![CDATA[<p><strong>Habe etwas zum Präprozessor gefunden</strong></p>
<p>In einer Schachengine namens RobboLito kommt eine Metaprogrammierung mittels Präprozessor zum Einsatz, um nicht alle Funktionen manuell duplizieren zu müssen (wegen Weiss und Schwarz).</p>
<p>Ist ein typisches Problem, und hier kann man die gespiegelten Duplikate der Funktionen vom Präprozessor über die Dateigrenzen &quot;ersetzen&quot; lassen. Natürlich lassen sich - wie auch bei den Funktionstemplates - keine Funktionen mit externer Bindung mehr nutzen.</p>
<p><strong>Duplizierung für Schwarz und Weiss a.cpp</strong></p>
<pre><code class="language-cpp">int white_foo();
int black_foo();

#define my_foo black_foo

int my_foo() {
  // der eigentliche Algorithmus...
}

#undef my_foo

#define my_foo white_foo

int my_foo() {
  // der eigentliche Algorithmus...
}
</code></pre>
<p><strong>Oder etwas eleganter, damit der Code tatsächlich vom Präprozessor dupliziert wird</strong></p>
<pre><code class="language-cpp">// a_func.h

int white_foo();
int black_foo();

// a.cpp

#ifndef A_H
#define A_H

#include &quot;a_func.h&quot;
#include &quot;a.cpp&quot; // &quot;rekursives&quot; includieren
#include &quot;white.h&quot;

#else

#include &quot;black.h&quot;

#endif

int my_foo() {
  // der eigentliche Algorithmus...
}

// white.h

#undef my_foo
#define my_foo white_foo

// black.h

#define my_foo black_foo
</code></pre>
<p>Was ist der &quot;bessere&quot; Ansatz zum Duplizieren von Funktionen - der Präprozessor oder die Templates?</p>
<p>Ich habe zu wenig Ahnung, um das a priori einschätzen zu können <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890091</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Thu, 29 Apr 2010 18:19:42 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplates über Dateigrenzen on Thu, 29 Apr 2010 18:19:04 GMT]]></title><description><![CDATA[<p>und wieso möchtest du das nutzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890095</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 29 Apr 2010 18:19:04 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplates über Dateigrenzen on Thu, 29 Apr 2010 18:24:55 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>und wieso möchtest du das nutzen?</p>
</blockquote>
<p>Für die Entwicklung eines Rechenalgorithmus, in dem ich viele Funktionen duplizieren muss und zwar über die Dateigrenzen hinweg. Deswegen bin ich mit dem Templatemechanismus erstmal in der Sackgasse steckengeblieben, da mit das Problem mit dem C++ Standard (export template wird nicht unterstützt) nicht klar war.</p>
<p>Manuellen Duplizieren von Code ist blödsinnig, da zu viel Pflegeaufwand und fehleranfällig. Und wegen der Performance muss ich möglichst überall &quot;parametrisieren&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890098</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Thu, 29 Apr 2010 18:24:55 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplates über Dateigrenzen on Thu, 29 Apr 2010 18:29:10 GMT]]></title><description><![CDATA[<p>Aber wieso brauchst du unbedingt die Aufsplittung in *.cpp und *.h?<br />
Reicht es dir nicht, die definitionen in ne *.impl oder so zu schreiben und die am ende des headers zu includen?<br />
so ne präprozessor-&quot;hacks&quot; sind imho sehr unübersichtlich und imho haben sie in C++, wo es templates gibt keine daseinsberechtigung - in C ist das was anderes...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890101</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 29 Apr 2010 18:29:10 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplates über Dateigrenzen on Thu, 29 Apr 2010 21:37:32 GMT]]></title><description><![CDATA[<p>Tomahawk schrieb:</p>
<blockquote>
<p>Sicherlich auf das</p>
<pre><code class="language-cpp">export template
</code></pre>
<p>Siehe folgenden Link:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467.html</a></p>
</blockquote>
<p>Das macht keinen Sinn. Nicht nur, dass <code>export</code> schon heute kaum einsetzbar ist, sondern auch, dass es in C++0x offiziell aus dem Standard entfernt wird.** <code>export</code> wird nicht mehr Bestandteil von C++ sein** – höchstens noch als reserviertes Schlüsselwort ohne Bedeutung. Und das ist gut so.</p>
<p>Lies vielleicht auch <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1426.pdf" rel="nofollow">Why We Can't Efford Export</a>, dort erfährst du mehr über die Hintergründe.</p>
<p>Tomahawk schrieb:</p>
<blockquote>
<p>Was ist der &quot;bessere&quot; Ansatz zum Duplizieren von Funktionen - der Präprozessor oder die Templates?</p>
<p>Ich habe zu wenig Ahnung, um das a priori einschätzen zu können <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>Von den Möglichkeiten, Templates direkt zu nutzen oder sie mittels Präprozessor nachzubauen, halte ich die erste für die weitaus klügere. Wie bereits erwähnt hilft dir der Präprozessor nicht dabei, von Headerdefinitionen abzukehren. Im Gegenzug bringt er aber einige Probleme, die von Templates gelöst werden. Was nicht heisst, dass Makros nie angebracht wären, aber hier sind sie es definitiv nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890194</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 29 Apr 2010 21:37:32 GMT</pubDate></item></channel></rss>