<?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[Reicht Vorwärtsdeklaration bei Typ in Vektor?]]></title><description><![CDATA[<pre><code class="language-cpp">struct Bar;

class Foo {
   vector&lt;Bar&gt; barVector;
};
</code></pre>
<p>Reicht es, wenn ich hier Bar nur Vorwärtsdeklariere? Oder muss ich Bar vor Foo definieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/288569/reicht-vorwärtsdeklaration-bei-typ-in-vektor</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 22:00:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/288569.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 19 Jun 2011 11:06:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Reicht Vorwärtsdeklaration bei Typ in Vektor? on Sun, 19 Jun 2011 11:06:39 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct Bar;

class Foo {
   vector&lt;Bar&gt; barVector;
};
</code></pre>
<p>Reicht es, wenn ich hier Bar nur Vorwärtsdeklariere? Oder muss ich Bar vor Foo definieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2080545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2080545</guid><dc:creator><![CDATA[Deklarierer++]]></dc:creator><pubDate>Sun, 19 Jun 2011 11:06:39 GMT</pubDate></item><item><title><![CDATA[Reply to Reicht Vorwärtsdeklaration bei Typ in Vektor? on Sun, 19 Jun 2011 11:12:08 GMT]]></title><description><![CDATA[<p>Eine Vorwärtsdeklaration reicht aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2080546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2080546</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 19 Jun 2011 11:12:08 GMT</pubDate></item><item><title><![CDATA[Reply to Reicht Vorwärtsdeklaration bei Typ in Vektor? on Sun, 19 Jun 2011 11:15:24 GMT]]></title><description><![CDATA[<p>Ich dachte die reicht nur bei Zeigern und Referenzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2080548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2080548</guid><dc:creator><![CDATA[Deklarierer++]]></dc:creator><pubDate>Sun, 19 Jun 2011 11:15:24 GMT</pubDate></item><item><title><![CDATA[Reply to Reicht Vorwärtsdeklaration bei Typ in Vektor? on Sun, 19 Jun 2011 11:34:05 GMT]]></title><description><![CDATA[<p>Warum probierst du es nicht einfach selber aus? <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>
<pre><code class="language-cpp">#include &lt;vector&gt;

struct Bar;

class Foo
{
	std::vector&lt;Bar&gt; vBar;
};

struct Bar
{
	int x;
	int y;
};

int main()
{
	Foo f;
}
</code></pre>
<p>Compiliert unter Windows 7 + Visual Studio 2010 Express einwandfrei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2080555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2080555</guid><dc:creator><![CDATA[kljljkl]]></dc:creator><pubDate>Sun, 19 Jun 2011 11:34:05 GMT</pubDate></item><item><title><![CDATA[Reply to Reicht Vorwärtsdeklaration bei Typ in Vektor? on Sun, 19 Jun 2011 11:50:44 GMT]]></title><description><![CDATA[<p>Ich weiß dass es kompiliert. Ich frag mich nur warum^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2080568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2080568</guid><dc:creator><![CDATA[Deklarierer++]]></dc:creator><pubDate>Sun, 19 Jun 2011 11:50:44 GMT</pubDate></item><item><title><![CDATA[Reply to Reicht Vorwärtsdeklaration bei Typ in Vektor? on Sun, 19 Jun 2011 11:52:57 GMT]]></title><description><![CDATA[<p>Deklarierer++ schrieb:</p>
<blockquote>
<p>Ich dachte die reicht nur bei Zeigern und Referenzen?</p>
</blockquote>
<p>Die Trick ist, dass der vector&lt;Bar&gt; selber gar kein Bar enthält. Ein vector ist immer gleich groß, egal welchen Datentyp er enthält (außer eventuelle Spezialisierungen wie vector&lt;bool&gt;), daher ist das für die Klassendefinition vollkommen ausreichend. Erst wenn tatsächlich Methoden des vectors verwendet werden, die an der Definition von Bar hängen (z.B. den Konstruktor des vectors), ist diese nötig.</p>
<p>Vergleiche auch:</p>
<pre><code class="language-cpp">struct Bar;

template&lt;class T&gt; class test
{ };

class Foo {
  test&lt;Bar&gt; bartest;  // Geht
}; 

int main()
{
  Foo foo;   // Geht
}
</code></pre>
<pre><code class="language-cpp">struct Bar;

template&lt;class T&gt; class test
{
  T t;
};

class Foo {
  test&lt;Bar&gt; bartest;   // Geht nicht
}; 

int main()
{
  Foo foo;   // Erst recht nicht
}
</code></pre>
<pre><code class="language-cpp">struct Bar;

template&lt;class T&gt; struct test
{
  T *t;
  void method_without_T()
  {
    T* t;
  }
  void method_with_T()
  {
    T t;
  }
};

struct Foo {
  test&lt;Bar&gt; bartest;  // Geht
}; 

int main()
{
  Foo foo;   // Geht

  foo.bartest.method_without_T();  // Geht
  foo.bartest.method_with_T();     // Geht nicht
}
</code></pre>
<p>Ich weiß aber gerade nicht auswendig, ob dir garantiert ist, dass die Standardcontainer keine konkreten Elemente enthalten. Es macht programmiertechnisch Sinn, daher wird das jede Implementierung so machen, aber für harte Garantien müsste mal jemand den Standard durchsuchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2080569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2080569</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 19 Jun 2011 11:52:57 GMT</pubDate></item><item><title><![CDATA[Reply to Reicht Vorwärtsdeklaration bei Typ in Vektor? on Sun, 19 Jun 2011 11:51:40 GMT]]></title><description><![CDATA[<p>Deklarierer++ schrieb:</p>
<blockquote>
<p>Ich dachte die reicht nur bei Zeigern und Referenzen?</p>
</blockquote>
<p>Kommt halt drauf an was vector benutzt. Das Template Argument sagt sagt ja nur aus mit was der generische Typ ersetzt wird. Und anscheinend benutzt vector nur Zeiger/Referenzen. Wenn vector jetzt eine Instanz von T speichern würde (direkt), dann würde es nicht kompilieren.</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class foo
{
 T* f;
};

template&lt;class T&gt;
class bar
{
 T b;
};

class blubb;

int main()
{
 foo&lt;blubb&gt; f; // kompiliert
 bar&lt;blubb&gt; b; // fehler
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2080570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2080570</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 19 Jun 2011 11:51:40 GMT</pubDate></item><item><title><![CDATA[Reply to Reicht Vorwärtsdeklaration bei Typ in Vektor? on Sun, 19 Jun 2011 11:57:10 GMT]]></title><description><![CDATA[<p>Laut Standard ist es UB, Std-Templates mit unvollständigen Typen zu instantiieren (außer es wird explizit als Ausnahme gekennzeichnet, wie z.B. <code>unique_ptr</code> ). Demnach sollte das Beispiel falsch sein, auch wenn es wohl bei den meisten Compilern funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2080574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2080574</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Sun, 19 Jun 2011 11:57:10 GMT</pubDate></item><item><title><![CDATA[Reply to Reicht Vorwärtsdeklaration bei Typ in Vektor? on Sun, 19 Jun 2011 12:01:57 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>Laut Standard ist es UB, Std-Templates mit unvollständigen Typen zu instantiieren (außer es wird explizit als Ausnahme gekennzeichnet, wie z.B. <code>unique_ptr</code> ). Demnach sollte das Beispiel falsch sein, auch wenn es wohl bei den meisten Compilern funktioniert.</p>
</blockquote>
<p>Kannst du mich auf die Stelle verweisen? Ich suche gerade selber, da ich das gleich im Hinterkopf hatte und es bestätigt haben wollte, aber ich finde es nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2080578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2080578</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 19 Jun 2011 12:01:57 GMT</pubDate></item><item><title><![CDATA[Reply to Reicht Vorwärtsdeklaration bei Typ in Vektor? on Sun, 19 Jun 2011 12:14:18 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Kannst du mich auf die Stelle verweisen? Ich suche gerade selber, da ich das gleich im Hinterkopf hatte und es bestätigt haben wollte, aber ich finde es nicht.</p>
</blockquote>
<p>Genau das dachte ich auch gerade.</p>
<p>Interessanterweise kompiliert auch Folgendes auf MSVC und g++, obwohl <code>Bar</code> zum Zeitpunkt des <code>vector</code> -Konstruktoraufrufs unvollständig ist:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

struct Bar;

struct Foo
{
	std::vector&lt;Bar&gt; v;
};

int main()
{
    Foo f;
}

struct Bar {};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2080579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2080579</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 Jun 2011 12:14:18 GMT</pubDate></item><item><title><![CDATA[Reply to Reicht Vorwärtsdeklaration bei Typ in Vektor? on Sun, 19 Jun 2011 12:32:37 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>Laut Standard ist es UB, Std-Templates mit unvollständigen Typen zu instantiieren (außer es wird explizit als Ausnahme gekennzeichnet, wie z.B. <code>unique_ptr</code> ). Demnach sollte das Beispiel falsch sein, auch wenn es wohl bei den meisten Compilern funktioniert.</p>
</blockquote>
<p>Kann ich mir gut vorstellen. Sonst würde das ja bereits einen Teil der Implementierung implizieren.<br />
Sprich vector wäre erlaubt z.B eine Kopie des Objektes zu halten, was dann dazu führen würde, dass das Beispiel nicht kompiliert, wenn der Typ nicht vollständig ist.<br />
Ich nehme mal an, dass es daher UB ist, aber müsste auch genau nachschauen, ob das so ist.</p>
<p>EDIT:<br />
Ist UB laut 17.4.3.6/2</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2080586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2080586</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 19 Jun 2011 12:32:37 GMT</pubDate></item><item><title><![CDATA[Reply to Reicht Vorwärtsdeklaration bei Typ in Vektor? on Sun, 19 Jun 2011 16:27:43 GMT]]></title><description><![CDATA[<p>So ziemlich jedes Template aus der Standardbibliothek verlangt vollständig definierte Typen als Typparameter. Das steht so im ISO Text in der Einleitung für die StdLib. Das schließt sogar Dinge wie auto_ptr ein. Der kommende Standard macht hier ein paar Ausnahmen. So wird bei unique_ptr und shared_ptr explizit erwähnt, dass diese Klassentemplates unvollständige Typen unterstützen. std::vector&lt;&gt; gehört aber immer noch nicht dazu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2080685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2080685</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 19 Jun 2011 16:27:43 GMT</pubDate></item></channel></rss>