<?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[Zyklische Includes mit Templates]]></title><description><![CDATA[<p>Ich habe in meinem Programm folgendes Szenario: Das Programm soll eine Simulation berechnen, basierend auf gewissen Daten. Ich muss die Simulation mehrfach laufen lassen und jeweils die Daten eines einzelnen Durchlaufs speichern.</p>
<p>Dafür habe ich zwei Klassen Simulation und SimulationInstance erstellt, wobei erstere die Anfangsdaten speichert und die einzelnen Simulationsinstanzen erzeugt und laufen lässt. SimulationInstance soll nun auf die Daten von Simulation zugreifen können (ich möchte diese Daten nicht doppelt speichern).</p>
<p>Folgich müssen sich Simulation und SimulationInstance gegenseitig kennen. Meine Klassen sehen wie folgt aus:</p>
<p>siminstance.h</p>
<pre><code>#ifndef SIMINSTANCE_H
#define SIMINSTANCE_H

namespace mb
{
    template &lt;typename K&gt; class Simulation;

    template &lt;typename K&gt;
    class SimulationInstance
    {
    public:
        SimulationInstance(const Simulation&lt;K&gt; * simulation);

    public:
        const Simulation&lt;K&gt; *m_simulation;
    };

    #include &quot;simulation.h&quot;

    template &lt;typename K&gt;
    SimulationInstance&lt;K&gt;::SimulationInstance(const Simulation&lt;K&gt; *simulation)
        : m_simulation(simulation)
    { }

} // namespace mb

#endif // SIMINSTANCE_H
</code></pre>
<p>simulation.h</p>
<pre><code>#ifndef SIMULATION_H
#define SIMULATION_H

// Ein paar Library Includes

namespace mb
{
    template &lt;typename K&gt; class SimulationInstance;

    template &lt;typename K&gt;
    class Simulation
    {
    public:

        Simulation(const QStandardItemModel *population_model, const QStandardItemModel *forced_model,
                   const QStandardItemModel *forbidden_model);

        void simulate();
    private:
        // Ein paar Methoden und Felder (std::vector)
    };

    #include &quot;siminstance.h&quot;

    template &lt;typename K&gt;
    Simulation&lt;K&gt;::Simulation(const QStandardItemModel *population_model, const QStandardItemModel *forced_model,
                              const QStandardItemModel *forbidden_model)
    {
        // Initialisierung
    }

    template &lt;typename K&gt;
    void Simulation&lt;K&gt;::simulate()
    {
        SimulationInstance&lt;K&gt; inst(this); // Hier tritt der Fehler auf
    }

} // namespace mb

#endif // SIMULATION_H
</code></pre>
<p>Das Problem ist nun, dass ich den Fehler</p>
<blockquote>
<p>simulation.h:98: error: 'mb::SimulationInstance&lt;int&gt; inst' has incomplete type</p>
</blockquote>
<p>bekomme. Ich habe schon viel gegoogelt und ausprobiert aber sehe einfach nicht wo mein Fehler liegt.</p>
<p>Kann mir jemand sagen wie ich das lösen kann? Bin auch für bessere Designvorschläge von Simulation und SimulationInsance offen.</p>
<p>*Edit<br />
SimulationInstance.h heisst in Wirklichkeit siminstance.h, habs oben gefixt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326436/zyklische-includes-mit-templates</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Jul 2026 23:48:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326436.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Jun 2014 09:39:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zyklische Includes mit Templates on Wed, 18 Jun 2014 10:16:04 GMT]]></title><description><![CDATA[<p>Ich habe in meinem Programm folgendes Szenario: Das Programm soll eine Simulation berechnen, basierend auf gewissen Daten. Ich muss die Simulation mehrfach laufen lassen und jeweils die Daten eines einzelnen Durchlaufs speichern.</p>
<p>Dafür habe ich zwei Klassen Simulation und SimulationInstance erstellt, wobei erstere die Anfangsdaten speichert und die einzelnen Simulationsinstanzen erzeugt und laufen lässt. SimulationInstance soll nun auf die Daten von Simulation zugreifen können (ich möchte diese Daten nicht doppelt speichern).</p>
<p>Folgich müssen sich Simulation und SimulationInstance gegenseitig kennen. Meine Klassen sehen wie folgt aus:</p>
<p>siminstance.h</p>
<pre><code>#ifndef SIMINSTANCE_H
#define SIMINSTANCE_H

namespace mb
{
    template &lt;typename K&gt; class Simulation;

    template &lt;typename K&gt;
    class SimulationInstance
    {
    public:
        SimulationInstance(const Simulation&lt;K&gt; * simulation);

    public:
        const Simulation&lt;K&gt; *m_simulation;
    };

    #include &quot;simulation.h&quot;

    template &lt;typename K&gt;
    SimulationInstance&lt;K&gt;::SimulationInstance(const Simulation&lt;K&gt; *simulation)
        : m_simulation(simulation)
    { }

} // namespace mb

#endif // SIMINSTANCE_H
</code></pre>
<p>simulation.h</p>
<pre><code>#ifndef SIMULATION_H
#define SIMULATION_H

// Ein paar Library Includes

namespace mb
{
    template &lt;typename K&gt; class SimulationInstance;

    template &lt;typename K&gt;
    class Simulation
    {
    public:

        Simulation(const QStandardItemModel *population_model, const QStandardItemModel *forced_model,
                   const QStandardItemModel *forbidden_model);

        void simulate();
    private:
        // Ein paar Methoden und Felder (std::vector)
    };

    #include &quot;siminstance.h&quot;

    template &lt;typename K&gt;
    Simulation&lt;K&gt;::Simulation(const QStandardItemModel *population_model, const QStandardItemModel *forced_model,
                              const QStandardItemModel *forbidden_model)
    {
        // Initialisierung
    }

    template &lt;typename K&gt;
    void Simulation&lt;K&gt;::simulate()
    {
        SimulationInstance&lt;K&gt; inst(this); // Hier tritt der Fehler auf
    }

} // namespace mb

#endif // SIMULATION_H
</code></pre>
<p>Das Problem ist nun, dass ich den Fehler</p>
<blockquote>
<p>simulation.h:98: error: 'mb::SimulationInstance&lt;int&gt; inst' has incomplete type</p>
</blockquote>
<p>bekomme. Ich habe schon viel gegoogelt und ausprobiert aber sehe einfach nicht wo mein Fehler liegt.</p>
<p>Kann mir jemand sagen wie ich das lösen kann? Bin auch für bessere Designvorschläge von Simulation und SimulationInsance offen.</p>
<p>*Edit<br />
SimulationInstance.h heisst in Wirklichkeit siminstance.h, habs oben gefixt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2404365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404365</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Wed, 18 Jun 2014 10:16:04 GMT</pubDate></item><item><title><![CDATA[Reply to Zyklische Includes mit Templates on Wed, 18 Jun 2014 09:47:26 GMT]]></title><description><![CDATA[<p>steht da wirklich #include &quot;simulation.h&quot; in der Datei simulation.h ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2404370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404370</guid><dc:creator><![CDATA[großbuchstaben]]></dc:creator><pubDate>Wed, 18 Jun 2014 09:47:26 GMT</pubDate></item><item><title><![CDATA[Reply to Zyklische Includes mit Templates on Wed, 18 Jun 2014 10:17:04 GMT]]></title><description><![CDATA[<p>großbuchstaben schrieb:</p>
<blockquote>
<p>steht da wirklich #include &quot;simulation.h&quot; in der Datei simulation.h ?</p>
</blockquote>
<p><s>Da steht doch gar nicht [c]#include simulation.h[/c] in der Datei simulation.h?</s><br />
Sorry, ich hatte die Files falsch angeschrieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2404381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404381</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Wed, 18 Jun 2014 10:17:04 GMT</pubDate></item><item><title><![CDATA[Reply to Zyklische Includes mit Templates on Wed, 18 Jun 2014 10:17:56 GMT]]></title><description><![CDATA[<p>Die Dateien inkludieren sich immer noch selbst. Davon abgesehen ist es immer eine schlechte Idee, innerhalb eines Namensraums <code>#include</code> -Direktiven zu haben.</p>
<p>Hast du versucht, lediglich eine Datei am Anfang der anderen zu inkludieren? Templates werden ja nicht direkt kompiliert, sondern erst zum Zeitpunkt ihrer Instantiierung (wobei sich Compiler leicht unterschiedlich verhalten).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2404384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404384</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 18 Jun 2014 10:17:56 GMT</pubDate></item><item><title><![CDATA[Reply to Zyklische Includes mit Templates on Wed, 18 Jun 2014 12:10:14 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Davon abgesehen ist es immer eine schlechte Idee, innerhalb eines Namensraums <code>#include</code> -Direktiven zu haben.</p>
</blockquote>
<p>Ich habe das in irgend einem C++ Artikel gelesen... genau deshalb mag ich online Artikel zu C++ nicht.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Hast du versucht, lediglich eine Datei am Anfang der anderen zu inkludieren?</p>
</blockquote>
<p>Wunderbar, hat nach etwas ausprobieren geklappt. Ich musste noch die Forward-Declaration in den Namespace mb schreiben, ansonsten meckert der Compiler.</p>
<p>Vielen Dank für die Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2404409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404409</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Wed, 18 Jun 2014 12:10:14 GMT</pubDate></item></channel></rss>