<?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[Gegenseitiges Includen zweier Klassen; (eine Klasse ist eine template class)]]></title><description><![CDATA[<p>Ich habe eine template Klasse Vektor und eine Klasse Point. Und beide sollen entsprechende Kopierkonstruktoren erhalten um sich gegenseitig umzuwandeln.<br />
In der Klasse Vektor, kann ich leider nicht pre-deklarieren, weil die Implementation in der selben Datei stehen muss wie die Definition. deshalb binde ich den Header für Point direkt ein (entsprechendes wurde auskommentiert):</p>
<pre><code class="language-cpp">//#include &quot;Point.h&quot;

namespace MATH {

template &lt;class T&gt;
class Vec3 : public Vector&lt;T&gt; {
	template&lt;class&gt; friend class Vector;

public:
	Vec3();
	Vec3(const T &amp;x, const T &amp;y, const T &amp;z);
	Vec3(const Vector&lt;T&gt; &amp;vector);
	Vec3(const Vec3&lt;T&gt; &amp;vector);
	//Vec3(const Point &amp;point);
</code></pre>
<p>In der Klasse Point habe ich probiert durch predeklaration in der definition und includierung in der implementation typdefinitionsfehler(oder wie das heißt) zu vermeiden:</p>
<pre><code class="language-cpp">class Point {
	template&lt;class&gt; class Vec3; // pre-deklaration

public:
	Point( float x = 0, float y = 0, float z = 0 );
	Point( const Vec3&lt;float&gt; &amp; );
</code></pre>
<pre><code class="language-cpp">Point::Point(const Vec3&lt;float&gt; &amp;vector) {
	m_fX = vector.X();
	m_fY = vector.Y();
	m_fZ = vector.Z();
}
</code></pre>
<p>Ich bekomme jedoch den fehler dass die predeklaration incomplete ist, wobei dem compiler sowas doch egal sein kann.</p>
<pre><code>../src/Point.cpp: In constructor ‘Point::Point(const Point::Vec3&lt;float&gt;&amp;)’:
../src/Point.cpp:19: error: invalid use of incomplete type ‘const struct Point::Vec3&lt;float&gt;’
../src/Point.h:12: error: declaration of ‘const struct Point::Vec3&lt;float&gt;’
../src/Point.cpp:20: error: invalid use of incomplete type ‘const struct Point::Vec3&lt;float&gt;’
../src/Point.h:12: error: declaration of ‘const struct Point::Vec3&lt;float&gt;’
../src/Point.cpp:21: error: invalid use of incomplete type ‘const struct Point::Vec3&lt;float&gt;’
../src/Point.h:12: error: declaration of ‘const struct Point::Vec3&lt;float&gt;’
</code></pre>
<p>Die einzige möglichkeit, das problem zu umgehen scheint zu sein, dass man den header für den vektor hier auch in der definition inkludiert.</p>
<p>allerdings funktioniert, dass wegen der kreisförmigen includierung leider nur in einer der beiden klassen ):</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/234345/gegenseitiges-includen-zweier-klassen-eine-klasse-ist-eine-template-class</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 11:00:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/234345.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Feb 2009 18:44:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gegenseitiges Includen zweier Klassen; (eine Klasse ist eine template class) on Mon, 16 Feb 2009 18:44:09 GMT]]></title><description><![CDATA[<p>Ich habe eine template Klasse Vektor und eine Klasse Point. Und beide sollen entsprechende Kopierkonstruktoren erhalten um sich gegenseitig umzuwandeln.<br />
In der Klasse Vektor, kann ich leider nicht pre-deklarieren, weil die Implementation in der selben Datei stehen muss wie die Definition. deshalb binde ich den Header für Point direkt ein (entsprechendes wurde auskommentiert):</p>
<pre><code class="language-cpp">//#include &quot;Point.h&quot;

namespace MATH {

template &lt;class T&gt;
class Vec3 : public Vector&lt;T&gt; {
	template&lt;class&gt; friend class Vector;

public:
	Vec3();
	Vec3(const T &amp;x, const T &amp;y, const T &amp;z);
	Vec3(const Vector&lt;T&gt; &amp;vector);
	Vec3(const Vec3&lt;T&gt; &amp;vector);
	//Vec3(const Point &amp;point);
</code></pre>
<p>In der Klasse Point habe ich probiert durch predeklaration in der definition und includierung in der implementation typdefinitionsfehler(oder wie das heißt) zu vermeiden:</p>
<pre><code class="language-cpp">class Point {
	template&lt;class&gt; class Vec3; // pre-deklaration

public:
	Point( float x = 0, float y = 0, float z = 0 );
	Point( const Vec3&lt;float&gt; &amp; );
</code></pre>
<pre><code class="language-cpp">Point::Point(const Vec3&lt;float&gt; &amp;vector) {
	m_fX = vector.X();
	m_fY = vector.Y();
	m_fZ = vector.Z();
}
</code></pre>
<p>Ich bekomme jedoch den fehler dass die predeklaration incomplete ist, wobei dem compiler sowas doch egal sein kann.</p>
<pre><code>../src/Point.cpp: In constructor ‘Point::Point(const Point::Vec3&lt;float&gt;&amp;)’:
../src/Point.cpp:19: error: invalid use of incomplete type ‘const struct Point::Vec3&lt;float&gt;’
../src/Point.h:12: error: declaration of ‘const struct Point::Vec3&lt;float&gt;’
../src/Point.cpp:20: error: invalid use of incomplete type ‘const struct Point::Vec3&lt;float&gt;’
../src/Point.h:12: error: declaration of ‘const struct Point::Vec3&lt;float&gt;’
../src/Point.cpp:21: error: invalid use of incomplete type ‘const struct Point::Vec3&lt;float&gt;’
../src/Point.h:12: error: declaration of ‘const struct Point::Vec3&lt;float&gt;’
</code></pre>
<p>Die einzige möglichkeit, das problem zu umgehen scheint zu sein, dass man den header für den vektor hier auch in der definition inkludiert.</p>
<p>allerdings funktioniert, dass wegen der kreisförmigen includierung leider nur in einer der beiden klassen ):</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664885</guid><dc:creator><![CDATA[gentoo]]></dc:creator><pubDate>Mon, 16 Feb 2009 18:44:09 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Includen zweier Klassen; (eine Klasse ist eine template class) on Mon, 16 Feb 2009 19:21:54 GMT]]></title><description><![CDATA[<p>Mir stellt sich da die Frage, wieso man eine Template-Klassen-Instanz (!) für Vektoren einer Nicht-Template-Klassen-Instanz für Punkte zuweisen können sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664909</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 16 Feb 2009 19:21:54 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Includen zweier Klassen; (eine Klasse ist eine template class) on Mon, 16 Feb 2009 19:48:15 GMT]]></title><description><![CDATA[<p>naja, eigentlich macht das wirklich nur in eine richtung sinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664916</guid><dc:creator><![CDATA[gentoo]]></dc:creator><pubDate>Mon, 16 Feb 2009 19:48:15 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Includen zweier Klassen; (eine Klasse ist eine template class) on Mon, 16 Feb 2009 22:42:50 GMT]]></title><description><![CDATA[<p>gentoo schrieb:</p>
<blockquote>
<p>Ich habe eine template Klasse Vektor und eine Klasse Point. Und beide sollen entsprechende Kopierkonstruktoren erhalten um sich gegenseitig umzuwandeln.</p>
</blockquote>
<p>Du verwechselst da was: Kopierkonstruktoren nehmen ein Parameter des eigenen Typs als (Const-)Referenz. Du meinst wohl eher einen Konvertierungskonstruktor (wobei dieser Begriff nicht sehr häufig anzutreffen ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1665009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1665009</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 16 Feb 2009 22:42:50 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Includen zweier Klassen; (eine Klasse ist eine template class) on Tue, 17 Feb 2009 18:12:28 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Point {
	template&lt;class&gt; class Vec3; // pre-deklaration
</code></pre>
<p>Du deklarierst hier eine Klasse Point::Vec3, definierst aber nur Vec3. Die Forward-Deklaration muss ausserhalb der Klasse stehen.</p>
<pre><code class="language-cpp">template&lt;class&gt; class Vec3;
class Point {
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1665424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1665424</guid><dc:creator><![CDATA[esx]]></dc:creator><pubDate>Tue, 17 Feb 2009 18:12:28 GMT</pubDate></item></channel></rss>