<?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 nicht rechtzeitig initialisiert]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich komme einfach nicht dahinter... <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="😞"
    /> ...ich verstehe nicht warum<br />
<strong>PreInitData.data</strong>, welche in B.cpp als Parameter an den Konstruktor<br />
von <strong>p</strong> übergeben wird, dort nicht bereits mit 100.0 initialisiert ist?</p>
<p>Wäre toll wenn mir das jemand erklären könnte, 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>
<pre><code class="language-cpp">// Datei A.h

#pragma once

template &lt;class T&gt; class A {
  public :

  T data;  

  static const A&lt;T&gt; PreInitData;

  A(T x);
};

template &lt;class T&gt; const A&lt;T&gt; A&lt;T&gt;::PreInitData(100.0);

template &lt;class T&gt; A&lt;T&gt;::A(T x) {
  data= x;
}
</code></pre>
<pre><code class="language-cpp">// Datei A.cpp (leer)

#include &quot;A.h&quot;
</code></pre>
<pre><code class="language-cpp">// Datei B.h

#pragma once

#include &quot;A.h&quot;

class B {
  static A&lt;float&gt; p;
};
</code></pre>
<pre><code class="language-cpp">// Datei B.cpp

#include &quot;B.h&quot;

A&lt;float&gt; B::p(A&lt;float&gt;::PreInitData.data);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/219033/template-nicht-rechtzeitig-initialisiert</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 03:12:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219033.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Jul 2008 23:14:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template nicht rechtzeitig initialisiert on Mon, 28 Jul 2008 23:14:37 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich komme einfach nicht dahinter... <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="😞"
    /> ...ich verstehe nicht warum<br />
<strong>PreInitData.data</strong>, welche in B.cpp als Parameter an den Konstruktor<br />
von <strong>p</strong> übergeben wird, dort nicht bereits mit 100.0 initialisiert ist?</p>
<p>Wäre toll wenn mir das jemand erklären könnte, 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>
<pre><code class="language-cpp">// Datei A.h

#pragma once

template &lt;class T&gt; class A {
  public :

  T data;  

  static const A&lt;T&gt; PreInitData;

  A(T x);
};

template &lt;class T&gt; const A&lt;T&gt; A&lt;T&gt;::PreInitData(100.0);

template &lt;class T&gt; A&lt;T&gt;::A(T x) {
  data= x;
}
</code></pre>
<pre><code class="language-cpp">// Datei A.cpp (leer)

#include &quot;A.h&quot;
</code></pre>
<pre><code class="language-cpp">// Datei B.h

#pragma once

#include &quot;A.h&quot;

class B {
  static A&lt;float&gt; p;
};
</code></pre>
<pre><code class="language-cpp">// Datei B.cpp

#include &quot;B.h&quot;

A&lt;float&gt; B::p(A&lt;float&gt;::PreInitData.data);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1555316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555316</guid><dc:creator><![CDATA[Gast2008]]></dc:creator><pubDate>Mon, 28 Jul 2008 23:14:37 GMT</pubDate></item><item><title><![CDATA[Reply to Template nicht rechtzeitig initialisiert on Mon, 28 Jul 2008 23:56:36 GMT]]></title><description><![CDATA[<ol>
<li>zero-initialization</li>
<li>static-initialization</li>
<li>dynamic-initialization</li>
</ol>
<p>Der Code in B.cpp läuft in 2), der Code in A.h läuft in 3). Also ist klar was passiert.<br />
Dass in Phase 2) ein Wert verwendet wird der in Phase 3) geändert wird ist &quot;schlecht&quot;, aber AFAIK erlaubt, und das Ergebnis wäre laut Standard IMO falsch wenn es anders wäre (also nicht 0).</p>
<p>Die richtige Reihenfolge bei der Initialisierung zu erzwingen ist ein altbekanntes Problem in C++. Ohne eine mir bekannte Lösung die sich überall schön anwenden liesse. Allerdings lässt sich natürlich immer irgendwie (mehr oder weniger schön) herumbauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555330</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 28 Jul 2008 23:56:36 GMT</pubDate></item><item><title><![CDATA[Reply to Template nicht rechtzeitig initialisiert on Tue, 29 Jul 2008 07:13:56 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Dass in Phase 2) ein Wert verwendet wird der in Phase 3) geändert wird ist &quot;schlecht&quot;, aber AFAIK erlaubt, und das Ergebnis wäre laut Standard IMO falsch wenn es anders wäre (also nicht 0).</p>
</blockquote>
<p>Der Standard erlaubt es ausdrücklich, die Initialisierung von A&lt;float&gt;::PreInitData.data als statische Initialisierung durchzuführen. Es ist somit unspezifiziert, ob B::p mit 0 oder 100 initialisiert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555384</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 29 Jul 2008 07:13:56 GMT</pubDate></item><item><title><![CDATA[Reply to Template nicht rechtzeitig initialisiert on Tue, 29 Jul 2008 09:12:33 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>: Das wird ja immer blöder. Was muss man dann anstellen damit das nichtmehr erlaubt ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555460</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 29 Jul 2008 09:12:33 GMT</pubDate></item><item><title><![CDATA[Reply to Template nicht rechtzeitig initialisiert on Tue, 29 Jul 2008 11:07:41 GMT]]></title><description><![CDATA[<p>Warum sollte man das wollen? Die Abhängigkeit von A&lt;float&gt;::PreInitData.data ist hier ja überhaupt erst dadurch sinnvoll, dass wir wollen, dass PreInitData an dieser Stelle bereits (richtig) initialisiert ist. Mithin müsste die Frage eher lauten, wie das Ganze modifiziert werden muss, damit diese Initialisierung sicher rechtzeitig stattgefunden hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555544</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 29 Jul 2008 11:07:41 GMT</pubDate></item><item><title><![CDATA[Reply to Template nicht rechtzeitig initialisiert on Tue, 29 Jul 2008 11:58:14 GMT]]></title><description><![CDATA[<p>Vielleicht mit einer statischen Methode, und die Variable statisch zur Methode statt zur Klasse machen?</p>
<pre><code class="language-cpp">// Datei A.h

#pragma once

template &lt;class T&gt; class A {
  public :

  T data;  

  static const A&lt;T&gt;&amp; getPreInitData();

  A(T x);
};

template &lt;class T&gt; const A&lt;T&gt;&amp; A&lt;T&gt;::getPreInitData()
{
  static const A&lt;T&gt; preInitData(100.0);
  return preInitData;
}

template &lt;class T&gt; A&lt;T&gt;::A(T x) {
  data= x;
}
</code></pre>
<p>Jetzt müsste beim ersten Aufruf von getPreInitData() doch auf jeden Fall preInitData initalisiert werden oder nicht?<br />
@OP: was willst du überhaupt damit erreichen? das sieht mir ein wenig nach Singleton-Pattern aus, nur dass du den Ctor und auch die Attribute (!) sämtlich public gemacht hast (was bei Attributen in 99,9% der Fälle schlecht ist, wenns nicht grade um einfache Datenbündel-Structs geht)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555596</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 29 Jul 2008 11:58:14 GMT</pubDate></item><item><title><![CDATA[Reply to Template nicht rechtzeitig initialisiert on Tue, 29 Jul 2008 12:07:13 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Antworten!</p>
<p>Warum läuft denn der Code in A.h in 3) dynamic-initialization?<br />
Mit dynamisch ist doch zur Laufzeit gemeint? Sorry wenn die<br />
Frage doof ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555609</guid><dc:creator><![CDATA[Gast2008]]></dc:creator><pubDate>Tue, 29 Jul 2008 12:07:13 GMT</pubDate></item><item><title><![CDATA[Reply to Template nicht rechtzeitig initialisiert on Tue, 29 Jul 2008 17:07:07 GMT]]></title><description><![CDATA[<p>Weil A dank des selbst deklarierten Konstruktors kein POD ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555818</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 29 Jul 2008 17:07:07 GMT</pubDate></item><item><title><![CDATA[Reply to Template nicht rechtzeitig initialisiert on Wed, 30 Jul 2008 13:59:54 GMT]]></title><description><![CDATA[<p>Mhm aber auch wenn ich A.h so ändere...</p>
<p>template &lt;class T&gt; const A&lt;T&gt; A&lt;T&gt;::PreInitData= 100.0;</p>
<p>...d.h. für die initialisierung nicht den selbst<br />
deklarierten Konstruktor verwende, bekomm ich in<br />
B.cpp immernoch ne 0.0 statt 100.0.</p>
<p>Dabei müßte doch jetzt alles auf statischer Ebene ablaufen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556433</guid><dc:creator><![CDATA[Gast2008]]></dc:creator><pubDate>Wed, 30 Jul 2008 13:59:54 GMT</pubDate></item><item><title><![CDATA[Reply to Template nicht rechtzeitig initialisiert on Wed, 30 Jul 2008 14:03:44 GMT]]></title><description><![CDATA[<p>Auch wenn Du das Datum jetzt anders initialisierst, ist A immernoch kein POD. Darüberhinaus erzeugen &quot;A a(...)&quot; und &quot;A a = ...&quot; den gleichen Code, sie haben nur etwas andere Anforderungen bezüglich der Semantik des Objekts (expliziter vs. impliziter Konstruktor, Zuweisung muss möglich sein).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556435</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 30 Jul 2008 14:03:44 GMT</pubDate></item><item><title><![CDATA[Reply to Template nicht rechtzeitig initialisiert on Wed, 30 Jul 2008 18:58:39 GMT]]></title><description><![CDATA[<p>Gott ist der Code verworren und unübersichtlich, und das mit bloss ein paar Zeilen. Pfui Deibel.<br />
Ich habe im Übrigen Mist geschrieben denke ich, ist beides dynamische Initialisierung. Hab mich zuerst &quot;verguckt&quot; und geglaubt eins davon wäre ne einfache Variable (eingebauter Typ), aber es geht ja beide male um ein A&lt;T&gt;.</p>
<p>Und A&lt;T&gt; ist wie camper schon schreibt kein POD und wird dauer auch nicht statisch initialisiert, sondern dynamisch, und zwar indem der Konstruktor aufgerufen wird.</p>
<p>BTW: ich finde es ziemlich grausig wenn eine Klasse ein statisches Member des eigenen Typs hat. Und WENN man sowas schon machen muss, dann wäre ein besserer Name als &quot;PreInitData&quot; sicher hilfreich.</p>
<p>Also nochmal konkret: A&lt;float&gt;::PreInitData und B::p sind beides Instanzen von A&lt;float&gt; und werden daher beide dynamisch initialisiert (nach der zero-initialization natürlich). Ob nun aber A&lt;float&gt;::PreInitData oder B::p zuerst drankommt ist purer Zufall, da die Reihenfolge nicht definiert ist.</p>
<p>Und ich hoffe nicht schonwieder etwas übersehen zu haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556607</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 30 Jul 2008 18:58:39 GMT</pubDate></item><item><title><![CDATA[Reply to Template nicht rechtzeitig initialisiert on Thu, 31 Jul 2008 14:25:12 GMT]]></title><description><![CDATA[<p>mhm okay danke euch allen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> <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/1557083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557083</guid><dc:creator><![CDATA[Gast2008]]></dc:creator><pubDate>Thu, 31 Jul 2008 14:25:12 GMT</pubDate></item><item><title><![CDATA[Reply to Template nicht rechtzeitig initialisiert on Mon, 04 Aug 2008 12:31:58 GMT]]></title><description><![CDATA[<p><strong><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>:</strong></p>
<p>Deine Lösung funktioniert! Danke!<br />
Aber warum funktioniert das? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558979</guid><dc:creator><![CDATA[Gast2008]]></dc:creator><pubDate>Mon, 04 Aug 2008 12:31:58 GMT</pubDate></item><item><title><![CDATA[Reply to Template nicht rechtzeitig initialisiert on Mon, 04 Aug 2008 12:41:25 GMT]]></title><description><![CDATA[<p>Gast2008 schrieb:</p>
<blockquote>
<p>Aber warum funktioniert das? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Weil die statische Variable innerhalb der Funktion auf jeden Fall initialisiert wird, sobald die Funktion das erste Mal aufgerufen wird.<br />
Ich überlasse das jetzt mal den Profis, festzustellen in welcher der init-phasen das jetzt genau stattfindet, es funktioniert auf jeden Fall so gut wie immer.</p>
<p>Was nicht funktionieren kann ist natürlich wenn sich zwei Initialisierungsroutinen für statische Funktionsmember gegenseitig aufrufen, etwa folgender Art:</p>
<pre><code class="language-cpp">struct Foo {
  static int get();
};

struct Bar {
  static int get()
  {
    const static int i = Foo::get();
    return i;
  }
};

int Foo::get()
{
  const static int f = Bar::get();
  return f;
}
</code></pre>
<p>Aber kein halbwegs vernünftiger Entwickler würde solche Kreisabhängigkeiten produzieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558997</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 04 Aug 2008 12:41:25 GMT</pubDate></item></channel></rss>