<?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[Template Templates  +  redefinition Fehler]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>dieses mal habe ich mich deutlich mehr informiert(leider nur mit begrenztem Erfolg). Wie der Titel sagt geht es um Template-Templates. Als Reference habe ich gegoogelt, &quot;Introduction to C++ Templates&quot; von Anthony Williams gelesen und im Standardwerk von Bjarne Stroustrup &quot;The C++ Programming Language&quot; gesucht. Im letzten steht es bestimmt, aber im entsprechenden Kapitel habe ich nichts dazu gefunden.</p>
<p>Und zwar sieht mein Quellcode wie folgt aus:</p>
<pre><code class="language-cpp">#ifndef EXAMPLE_H_
#define EXAMPLE_H_

template
&lt;
	typename T,
	template
	&lt;
		typename T
	&gt;
	class Storage
&gt;
class example
{
	public:
		example();
		void insert_element(T new_element);
	private:
		Storage&lt;T&gt;  storage_;
};

#include &quot;example.cpp&quot;

#endif /* EXAMPLE_H_ */
</code></pre>
<p>und</p>
<pre><code class="language-cpp">#include &quot;example.h&quot;
template
&lt;
	typename T,
	template
	&lt;
		typename T
	&gt;
	class Storage
&gt;
example&lt;T, Storage &gt;::example()
{
	// TODO Auto-generated constructor stub

}

template
&lt;
	typename T,
	template
	&lt;
		typename T
	&gt;
	class Storage
&gt;
void example&lt;T, Storage &gt;::insert_element(T new_element)
{

}
</code></pre>
<p>Die Compilermeldungen sind:</p>
<blockquote>
<p>../src/example.cpp:18: error: redefinition of 'example&lt;T, Storage&gt;::example()'<br />
../src/example.cpp:18: error: 'example&lt;T, Storage&gt;::example()' previously declared here<br />
../src/example.cpp:33: error: redefinition of 'void example&lt;T, Storage&gt;::insert_element(T)'<br />
../src/example.cpp:33: error: 'void example&lt;T, Storage&gt;::insert_element(T)' previously declared here</p>
</blockquote>
<p>Könnt ihr mir einen Tipp geben, wie ich mit diesen umzugehen hab? Leider entdecke ich nicht, wo sie vorher deklariert wurden. In diesem Zusammenhang würde ich gerne noch eine weitere Frage stellen.</p>
<pre><code class="language-cpp">template
&lt;
	typename T,
	template
	&lt;
		typename HIER
	&gt;
	class Storage
&gt;
</code></pre>
<p>Beim Suchen ist mir aufgefallen, dass wo &quot;HIER&quot; steht schonmal ein Bezeichner vorhanden ist, aber nicht immer. Je nach Quelle. Kennt ihr ein Dokument wo genauer steht, wann dort etwas zu stehen hat und wann nicht?</p>
<p>Viele Grüße<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/250960/template-templates-redefinition-fehler</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 19:37:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/250960.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Sep 2009 11:29:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Templates  +  redefinition Fehler on Sun, 27 Sep 2009 11:29:44 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>dieses mal habe ich mich deutlich mehr informiert(leider nur mit begrenztem Erfolg). Wie der Titel sagt geht es um Template-Templates. Als Reference habe ich gegoogelt, &quot;Introduction to C++ Templates&quot; von Anthony Williams gelesen und im Standardwerk von Bjarne Stroustrup &quot;The C++ Programming Language&quot; gesucht. Im letzten steht es bestimmt, aber im entsprechenden Kapitel habe ich nichts dazu gefunden.</p>
<p>Und zwar sieht mein Quellcode wie folgt aus:</p>
<pre><code class="language-cpp">#ifndef EXAMPLE_H_
#define EXAMPLE_H_

template
&lt;
	typename T,
	template
	&lt;
		typename T
	&gt;
	class Storage
&gt;
class example
{
	public:
		example();
		void insert_element(T new_element);
	private:
		Storage&lt;T&gt;  storage_;
};

#include &quot;example.cpp&quot;

#endif /* EXAMPLE_H_ */
</code></pre>
<p>und</p>
<pre><code class="language-cpp">#include &quot;example.h&quot;
template
&lt;
	typename T,
	template
	&lt;
		typename T
	&gt;
	class Storage
&gt;
example&lt;T, Storage &gt;::example()
{
	// TODO Auto-generated constructor stub

}

template
&lt;
	typename T,
	template
	&lt;
		typename T
	&gt;
	class Storage
&gt;
void example&lt;T, Storage &gt;::insert_element(T new_element)
{

}
</code></pre>
<p>Die Compilermeldungen sind:</p>
<blockquote>
<p>../src/example.cpp:18: error: redefinition of 'example&lt;T, Storage&gt;::example()'<br />
../src/example.cpp:18: error: 'example&lt;T, Storage&gt;::example()' previously declared here<br />
../src/example.cpp:33: error: redefinition of 'void example&lt;T, Storage&gt;::insert_element(T)'<br />
../src/example.cpp:33: error: 'void example&lt;T, Storage&gt;::insert_element(T)' previously declared here</p>
</blockquote>
<p>Könnt ihr mir einen Tipp geben, wie ich mit diesen umzugehen hab? Leider entdecke ich nicht, wo sie vorher deklariert wurden. In diesem Zusammenhang würde ich gerne noch eine weitere Frage stellen.</p>
<pre><code class="language-cpp">template
&lt;
	typename T,
	template
	&lt;
		typename HIER
	&gt;
	class Storage
&gt;
</code></pre>
<p>Beim Suchen ist mir aufgefallen, dass wo &quot;HIER&quot; steht schonmal ein Bezeichner vorhanden ist, aber nicht immer. Je nach Quelle. Kennt ihr ein Dokument wo genauer steht, wann dort etwas zu stehen hat und wann nicht?</p>
<p>Viele Grüße<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784864</guid><dc:creator><![CDATA[MrMilk]]></dc:creator><pubDate>Sun, 27 Sep 2009 11:29:44 GMT</pubDate></item><item><title><![CDATA[Reply to Template Templates  +  redefinition Fehler on Sun, 27 Sep 2009 12:27:11 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#ifndef EXAMPLE_H_
#define EXAMPLE_H_

...

#include &quot;example.cpp&quot;

#endif /* EXAMPLE_H_ */
</code></pre>
<pre><code class="language-cpp">#include &quot;example.h&quot;
...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1784887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784887</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 27 Sep 2009 12:27:11 GMT</pubDate></item><item><title><![CDATA[Reply to Template Templates  +  redefinition Fehler on Sun, 27 Sep 2009 12:38:20 GMT]]></title><description><![CDATA[<p>In Worten: du hast ein Meta-Programm gebaut, was sich unendlich mal selber einbindet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784891</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sun, 27 Sep 2009 12:38:20 GMT</pubDate></item><item><title><![CDATA[Reply to Template Templates  +  redefinition Fehler on Sun, 27 Sep 2009 12:42:52 GMT]]></title><description><![CDATA[<p>Hallo camper,</p>
<p>vielen Dank für den Hinweis mit dem Löschen der Anweisung #include &quot;example.cpp&quot; klappt es nun. Was mir leider nicht klar ist, wieso es an der falschen Stelle ist.</p>
<p>In dem Buch von &quot;Heiko Kalista&quot; steht folgender Tipp:</p>
<blockquote>
<p>Deklarationen und Definitionen von Template-Klassen lassen sich nicht in separaten .hpp- und .cpp-Dateien unterbringen. Ein Compilerfehler ist die Folge. Man kann sich allerdings mit dem Trick weiterhelfen, die Definitionen in eine separate Datei zu schreiben und diese per #include direkt nach der Klassendeklaration einbinden</p>
</blockquote>
<p>Kannst du mir sagen wieso dieser hier nicht mehr gültig ist?</p>
<p>Viele Grüße<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784894</guid><dc:creator><![CDATA[MrMilk]]></dc:creator><pubDate>Sun, 27 Sep 2009 12:42:52 GMT</pubDate></item><item><title><![CDATA[Reply to Template Templates  +  redefinition Fehler on Sun, 27 Sep 2009 12:45:12 GMT]]></title><description><![CDATA[<p>Oh, die Antwort von Ad aCTa habe ich jetzt erst gesehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784895</guid><dc:creator><![CDATA[MrMilk]]></dc:creator><pubDate>Sun, 27 Sep 2009 12:45:12 GMT</pubDate></item><item><title><![CDATA[Reply to Template Templates  +  redefinition Fehler on Sun, 27 Sep 2009 15:24:39 GMT]]></title><description><![CDATA[<p>Die Antwort von Ad aCTa stimmt aber nicht (ganz).</p>
<p>Durch die Include-Guards &quot;EXAMPLE_H_&quot; wird dies unterbunden:<br />
example.cpp -&gt; example.h -&gt; example.cpp -&gt; example.h (Include-Guard wirkt!).</p>
<p>(Nichtsdestotrotz sollten sich Dateien natürlich nicht gegenseitig einbinden.)</p>
<p>Die Redefinition kommt dadurch zustande, daß nun example.cpp zweimal vom Compiler abgearbeitet wird (da sie selber keine Include-Guards hat - was aber auch nicht nötig ist, s.u.).<br />
Die Datei 'example.cpp' sollte auch nicht zum Projekt hinzugefügt werden (d.h. einzeln compiliert - da unnötig).</p>
<p>Besser ist es, du nennst die Code-Datei &quot;example.inl&quot; (o.ä). (s.a. FAQ-Beitrag <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>
<p>Und bindest sie nun in der Header-Datei ein:</p>
<pre><code class="language-cpp">// example.h
#ifndef EXAMPLE_H_
#define EXAMPLE_H_

...

#include &quot;example.inl&quot;

#endif
</code></pre>
<pre><code class="language-cpp">// example.inl

// nur Template-Definitionen (kein include mehr)
</code></pre>
<p>Und nun brauchst du nur noch in anderen Code-Dateien die Header-Datei einbinden:</p>
<pre><code class="language-cpp">// main.cpp

#include &quot;example.h&quot;

// ...
</code></pre>
<p>So, ich hoffe dies ist dir jetzt klarer geworden (warum, weshalb, wieso)...</p>
<p>P.S: evtl. könnte man meinen Beitrag zum FAQ hinzufügen -)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1784993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1784993</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sun, 27 Sep 2009 15:24:39 GMT</pubDate></item><item><title><![CDATA[Reply to Template Templates  +  redefinition Fehler on Sun, 27 Sep 2009 17:51:26 GMT]]></title><description><![CDATA[<p>Hey Th69,</p>
<p>vielen Dank für die Antwort:) Hat mir weiter geholfen <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>
<p>viele grüße<br />
MM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1785048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1785048</guid><dc:creator><![CDATA[MrMilk]]></dc:creator><pubDate>Sun, 27 Sep 2009 17:51:26 GMT</pubDate></item></channel></rss>