<?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[Headereinbindungen bei templates]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem bei einem Programmierprinzip von C++. Es geht dabei um die &quot;Vorwärtsdeklarationen&quot;.</p>
<p>Prinzipiell deklariere ich ja Klassen, deren Funktionen und Eigenschaften im Header und definiere sie dann in der c Datei.</p>
<p>Nun benutze ich aber Templates. Ich habe gelesen, dass template Klassen (also deren Methoden) auch innerhalb der Datei, wo sie deklariert werden, definiert werden müssen (aus welchen Gründen auch immer). Und genau hier entstehen die Probleme. Jetzt müsste ich in dem Header meiner Template Klassen andere Header einbinden, was bei Kreuzverweisen irgendwann zu Fehlern führt... Wie kann ich diese Probleme umgehen???</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/282279/headereinbindungen-bei-templates</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 08:09:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/282279.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 17 Feb 2011 10:24:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Headereinbindungen bei templates on Thu, 17 Feb 2011 10:24:02 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem bei einem Programmierprinzip von C++. Es geht dabei um die &quot;Vorwärtsdeklarationen&quot;.</p>
<p>Prinzipiell deklariere ich ja Klassen, deren Funktionen und Eigenschaften im Header und definiere sie dann in der c Datei.</p>
<p>Nun benutze ich aber Templates. Ich habe gelesen, dass template Klassen (also deren Methoden) auch innerhalb der Datei, wo sie deklariert werden, definiert werden müssen (aus welchen Gründen auch immer). Und genau hier entstehen die Probleme. Jetzt müsste ich in dem Header meiner Template Klassen andere Header einbinden, was bei Kreuzverweisen irgendwann zu Fehlern führt... Wie kann ich diese Probleme umgehen???</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022161</guid><dc:creator><![CDATA[Headless]]></dc:creator><pubDate>Thu, 17 Feb 2011 10:24:02 GMT</pubDate></item><item><title><![CDATA[Reply to Headereinbindungen bei templates on Thu, 17 Feb 2011 10:54:59 GMT]]></title><description><![CDATA[<p>Headless schrieb:</p>
<blockquote>
<p>Ich habe gelesen, dass template Klassen (also deren Methoden) auch innerhalb der Datei, wo sie deklariert werden, definiert werden müssen (aus welchen Gründen auch immer).</p>
</blockquote>
<p>Das stimmt nicht. Bei der Verwendung von Templates muss ihre Definition sichtbar sein (damit der Compiler die Instanziierung durchführen kann), doch Deklarationen sind nach wie vor möglich, wo ein unvollständiger Typ erlaubt ist.</p>
<p>Und abgesehen davon werden Templates auch erst bei der Verwendung instanziiert. Das bedeutet, dass die strenge Deklarationsreihenfolge nicht immer eingehalten werden muss (es reicht, wenn benötigte Typen bei der Instanziierung vollständig sind).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022181</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 17 Feb 2011 10:54:59 GMT</pubDate></item><item><title><![CDATA[Reply to Headereinbindungen bei templates on Thu, 17 Feb 2011 11:18:38 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Das stimmt nicht. Bei der Verwendung von Templates muss ihre Definition sichtbar sein (damit der Compiler die Instanziierung durchführen kann), doch Deklarationen sind nach wie vor möglich, wo ein unvollständiger Typ erlaubt ist.</p>
</blockquote>
<p>Wie genau meinst du das?</p>
<p>h Datei:</p>
<pre><code class="language-cpp">template&lt;class T&gt; 
class A
{
public: 
	void meth();
};
</code></pre>
<p>Innerhalb der Methode meth() sollen andere Klassen, die in anderen Headern deklariert sind, benutzbar werden. Sobald ich den #include &quot;XYZ.h&quot; über die h Datei meiner Klassa A schreibe, enstehen unmengen an Fehlern...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022195</guid><dc:creator><![CDATA[Headless]]></dc:creator><pubDate>Thu, 17 Feb 2011 11:18:38 GMT</pubDate></item><item><title><![CDATA[Reply to Headereinbindungen bei templates on Thu, 17 Feb 2011 12:12:49 GMT]]></title><description><![CDATA[<p>Headless schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Das stimmt nicht. Bei der Verwendung von Templates muss ihre Definition sichtbar sein (damit der Compiler die Instanziierung durchführen kann), doch Deklarationen sind nach wie vor möglich, wo ein unvollständiger Typ erlaubt ist.</p>
</blockquote>
<p>Wie genau meinst du das?</p>
</blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct Foo;

template&lt;typename T&gt;
void useFooBar(const T&amp; value)
{
	Foo foo;
	foo.bar(value);
}

struct Foo
{
	void bar(int value) { std::cout &lt;&lt; &quot;bar &quot; &lt;&lt; value &lt;&lt; std::endl; }
};

int main()
{
	useFooBar(42);
}
</code></pre>
<p>Wäre useFooBar kein Template, sondern eine normale Funktion, müsste bereits bei der Definition von useFooBar die Funktion Foo::bar bekannt sein. In diesem Fall reicht es aber, wenn Foo::bar in main bekannt ist, da erst hier das Template instanziert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022217</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 17 Feb 2011 12:12:49 GMT</pubDate></item><item><title><![CDATA[Reply to Headereinbindungen bei templates on Thu, 17 Feb 2011 12:28:42 GMT]]></title><description><![CDATA[<p><a href="http://www.c-plusplus.net/forum/p1993089#1993089" rel="nofollow">http://www.c-plusplus.net/forum/p1993089#1993089</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022228</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Thu, 17 Feb 2011 12:28:42 GMT</pubDate></item><item><title><![CDATA[Reply to Headereinbindungen bei templates on Thu, 17 Feb 2011 12:43:15 GMT]]></title><description><![CDATA[<p>Und bei falls der Typ unvollständig sein darf, reicht eine Vorwärtsdeklaration.</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class Template;

Template&lt;int&gt;* pointer;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2022238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022238</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 17 Feb 2011 12:43:15 GMT</pubDate></item><item><title><![CDATA[Reply to Headereinbindungen bei templates on Thu, 17 Feb 2011 13:48:29 GMT]]></title><description><![CDATA[<p>Ok! Das macht Sinn. Bei mir ist die Struktur, aber um eingies komplexer, wodurch nicht erst in der main instanziiert wird:</p>
<p>Base.h</p>
<pre><code class="language-cpp">#pragma once
class Helper;
class upperBase
{
public:
    virtual void use()=0;
};

template&lt;class T&gt;
class Base : public upperBase
{
public:
    virtual void use()
    {
		Helper::bar&lt;Concrete&gt;();
	}
};
</code></pre>
<p>Concrete.h</p>
<pre><code class="language-cpp">#pragma once
#include &quot;Base.h&quot;

class Concrete : public Base&lt;int&gt;
{
public:
	Concrete();
};
</code></pre>
<p>Concrete.cpp</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &quot;Concrete.h&quot;

Concrete::Concrete()
{
}
</code></pre>
<p>Helper.h</p>
<pre><code class="language-cpp">#pragma once
static class Helper
{
public:
	template&lt;class P&gt; 
	static P bar() 
	{ 
		P p;
		return p;	
	}
};
</code></pre>
<p>Folgende Fehler entstehen:<br />
error C2027: Verwendung des undefinierten Typs &quot;Helper&quot;<br />
error C2065: 'bar': nichtdeklarierter Bezeichner<br />
error C2275: 'Concrete': Ungültige Verwendung dieses Typs als Ausdruck</p>
<p>In die Base.h &quot;#include &quot;Helper.h&quot; &quot; einzufügen ist leider keine Lösung...auch wenn das in diesem Beispiel funktioniert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022270</guid><dc:creator><![CDATA[Headless]]></dc:creator><pubDate>Thu, 17 Feb 2011 13:48:29 GMT</pubDate></item><item><title><![CDATA[Reply to Headereinbindungen bei templates on Thu, 17 Feb 2011 14:10:40 GMT]]></title><description><![CDATA[<ol>
<li>#pragma once ist Compilerabhängig, verwende lieber das übliche #ifdef zeugs.</li>
<li>Eine static class existiert in C++ nicht.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2022275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022275</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 17 Feb 2011 14:10:40 GMT</pubDate></item><item><title><![CDATA[Reply to Headereinbindungen bei templates on Thu, 17 Feb 2011 14:13:05 GMT]]></title><description><![CDATA[<p>Dann schreib halt</p>
<pre><code class="language-cpp">virtual void use();  //ohne Implementierung
</code></pre>
<p>und in einen anderen Header, den du dann inkludierst</p>
<pre><code class="language-cpp">#include &quot;Base.h&quot;
#include &quot;Concrete.h&quot;
#include &quot;Helper.h&quot;

template&lt;typename T&gt; void Base&lt;T&gt;::use()
{
    Helper::bar&lt;Concrete&gt;();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2022276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022276</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Thu, 17 Feb 2011 14:13:05 GMT</pubDate></item><item><title><![CDATA[Reply to Headereinbindungen bei templates on Thu, 17 Feb 2011 14:26:40 GMT]]></title><description><![CDATA[<p>Aber das ist doch auch nur von hinten in die Brust geschossen...</p>
<p>Wenn ich &quot; #include &quot;Helper.h&quot; &quot; in einem Header benutze, den ich dann wiederum inkludiere, dann kann ich die Helper.h auch direkt inkludieren?!</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23275">@314159265358979</a>:<br />
2) Mein Compiler beschwert sich aber gar nicht bei der static class?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022287</guid><dc:creator><![CDATA[Headless]]></dc:creator><pubDate>Thu, 17 Feb 2011 14:26:40 GMT</pubDate></item><item><title><![CDATA[Reply to Headereinbindungen bei templates on Thu, 17 Feb 2011 14:29:31 GMT]]></title><description><![CDATA[<p>Headless schrieb:</p>
<blockquote>
<ol start="2">
<li>Mein Compiler beschwert sich aber gar nicht bei der static class?!</li>
</ol>
</blockquote>
<p>Bist du sicher? Wie auch immer, Compiler dürfen Erweiterungen anbieten. Willst du portables C++ programmieren, verzichte auf <code>static class</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022291</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 17 Feb 2011 14:29:31 GMT</pubDate></item><item><title><![CDATA[Reply to Headereinbindungen bei templates on Thu, 17 Feb 2011 14:35:30 GMT]]></title><description><![CDATA[<p>Das ist seltsam, welchen Compiler hast du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022296</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 17 Feb 2011 14:35:30 GMT</pubDate></item><item><title><![CDATA[Reply to Headereinbindungen bei templates on Thu, 17 Feb 2011 14:41:12 GMT]]></title><description><![CDATA[<p>Da ist nichts in den Kopf geschossen. Nochmal:<br />
BaseDeclarations.h</p>
<pre><code class="language-cpp">//hier includeguards!!

class upperBase
{
public:
    virtual void use()=0;
};

template&lt;class T&gt;
class Base : public upperBase
{
public:
    virtual void use();
};
</code></pre>
<p>Concrete.h</p>
<pre><code class="language-cpp">//hier includeguards!!
#include &quot;BaseDeclarations.h&quot;

class Concrete : public Base&lt;int&gt;
{
public:
    Concrete();
};
</code></pre>
<p>Helper.h</p>
<pre><code class="language-cpp">//hier includeguards!!

class Helper
{
public:
    template&lt;class P&gt;
    static P bar()
    {
        P p;
        return p;   
    }
};
</code></pre>
<p>Base.h</p>
<pre><code class="language-cpp">//hier includeguards!!

#include &quot;Base.h&quot;
#include &quot;Concrete.h&quot;
#include &quot;Helper.h&quot;

template&lt;typename T&gt; void Base&lt;T&gt;::use()
{
    Helper::bar&lt;Concrete&gt;();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2022301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022301</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Thu, 17 Feb 2011 14:41:12 GMT</pubDate></item></channel></rss>