<?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 vektor klasse und template funktionen]]></title><description><![CDATA[<p>So, ich schreibe im Moment zu lernzwecken eine eigene Vektor-Klasse (Vektor als der mathematishen Vektor, nicht als Container).<br />
Da ich ein Problem gerne ein für alle mal löse, dachte ich mir, mach ich ein template für einen n-Dimensionalen Vektor welcher als zusätzliches template-Argument den Typ, welcher zur Speicherung der n Koordinaten benutzt wird, erhält (double, int, float etc.).<br />
Leider treten hierbei Fehler auf, welche ich mir nicht erklären kann (ich habe noch nicht so viel mit templates gearbeitet).</p>
<p>Hier mein Code:</p>
<pre><code class="language-cpp">#if !defined(VECTOR2D_INCLUDED)
#define VECTOR2D_INCLUDED

#if _MSC_VER &gt; 1000
#pragma once
#endif 

#include &quot;Math.hpp&quot;
//#include &lt;cstdio&gt;//??
//#include &lt;cstdlib&gt;//??
#include &lt;cstdarg&gt;

template&lt;class T, int Dimension&gt;
class Vector
{
private:
	T Scalars[Dimension];

protected:

public:
	T GetLength() const
	{
		return sqrt(DotProduct(*this,*this));
	}

	T GetScalar(int dimension) const
	{
		if (dimension&lt;Dimension)
		{
			return Scalars[dimension];
		}
		else
		{
			throw(&quot;bereichsüberschreitung vector getscalar&quot;);
		}
	}

	void SetLength(T length)
	{
		(*this)*=(length/this-&gt;GetLength())
	}
	void Normalize()
	{
		this-&gt;SetLength(1);
	}

	Vector(const Vector&lt;T, Dimension&gt;&amp; vector)
	{
		for (int i = 0; i&lt;Dimension;i++)
		{
			this-&gt;Scalars[i]=vector.Scalars[i];
		}
	}

	Vector()
	{
		for (int i = 0;i&lt;Dimension;++i)
		{
			Scalars[i] = 0;
		}	
	}

	Vector(T scalar, ...)
	{
		Scalars[0] = scalar;
		va_list zeiger;
		va_start(zeiger,scalar);
		for (int i = 0;i+1&lt;Dimension;++i)
		{
			Scalars[i+1] = va_arg(zeiger,int);
		}
	}

	virtual ~Vector()
	{

	}

	Vector&amp; operator= (const Vector&amp; vector)
	{
		for (int i = 0, i&lt;Dimension;i++)
		{
			this-&gt;Scalars[i]=vector.Scalars[i];
		}
	}

	void operator+= (const Vector&amp; vector)		//?????????void???
	{
		for (int i = 0, i&lt;Dimension;i++)
		{
			this-&gt;Scalars[i]+=vector.Scalars[i];
		}
	}

	void operator-= (const Vector&amp; vector)
	{
		for (int i = 0, i&lt;Dimension;i++)
		{
			this-&gt;Scalars[i]-=vector.Scalars[i];
		}
	}

	void operator*= (const T&amp; scalar)
	{
		for (int i = 0, i&lt;Dimension;i++)
		{
			this-&gt;Scalars[i]*=vector.Scalars[i];
		}
	}

	void operator/= (const T&amp; scalar)
	{
		if (scalar==0)
		{
			throw(&quot;also, für Koordinaten geht das nicht, für numerische typen geht das nicht, warum sollte das mit nem vektor gehen? nen unendlich langer vektor? nene, der passt doch nicht auf den Schirm!&quot;);
		}
		else
		{
			for (int i = 0; i&lt;Dimension;i++)
			{
				this-&gt;Scalars[i]/=scalar;
			}
		}
	}
	Vector&lt;T, Dimension&gt; operator/ (const T&amp; right) const
	{
		Vector&lt;T,Dimension&gt; temp;
		if (right == 0)
		{
			throw(&quot;äh nö, auch mit dem Operator gehts gaz dick in die Hose!!!! (aiaiai, dassollte wer aufwischen und zwar schnell!!!!!!&quot;);
		}
		else
		{
			for(int i = 0;i&lt;Dimension;i++)
			{
				temp.Scalars[i]=this-&gt;Scalars[i]/right;
			}
		}
		return temp;
	}

	Vector&lt;T, Dimension&gt; operator* (const T&amp; right) const
	{
		Vector&lt;T,Dimension&gt; temp;
		for(int i = 0;i&lt;Dimension;i++)
		{
			temp.Scalars[i]=this-&gt;Scalars[i]*right;
		}

		return temp;
	}

	Vector&lt;T, Dimension&gt; operator+ (const Vector&lt;T, Dimension&gt;&amp; right)
	{
		Vector&lt;T,Dimension&gt; temp;
		for(int i = 0;i&lt;Dimension;i++)
		{
			temp.Scalars[i]=this-&gt;Scalars[i]+right.Scalars[i];
		}
		return temp;
	}

	Vector&lt;T, Dimension&gt; operator- (const Vector&lt;T, Dimension&gt;&amp; right)
	{
		Vector&lt;T,Dimension&gt; temp;
		for(int i = 0;i&lt;Dimension;i++)
		{
			temp.Scalars[i]=this-&gt;Scalars[i]-right.Scalars[i];
		}

		return temp;
	}

/*friend Vector&lt;T, Dimension&gt; operator- (const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right);
friend Vector&lt;T, Dimension&gt; operator+ (const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right);
*/
friend T DotProduct(const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right);

};

/*template &lt;class T, int Dimension&gt;
Vector&lt;T, Dimension&gt; operator+ (const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right)
{
	Vector&lt;T,Dimension&gt; temp;
	for(int i = 0;i&lt;Dimension;i++)
	{
		temp.Scalars[i]=left.Scalars[i]+right.Scalars[i];
	}
	return temp;
}

template &lt;class T, int Dimension&gt;
Vector&lt;T, Dimension&gt; operator- (const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right)
{
	Vector&lt;T,Dimension&gt; temp;
	for(int i = 0;i&lt;Dimension;i++)
	{
		temp.Scalars[i]=left.Scalars[i]-right.Scalars[i];
	}

	return temp;
}
*/
template &lt;class T, int Dimension&gt;
T DotProduct(const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right)
{
	T result = 0;
	for(int i = 0;i&lt;Dimension;i++)
	{
		result += left.Scalars[i]*right.Scalars[i];
	}

	return result;
}

typedef Vector&lt;double,2&gt; Vector2DDouble;

#endif
</code></pre>
<p>leider ergibt folgende Verwendung:</p>
<pre><code class="language-cpp">Vector&lt;double,2&gt; centre;
				double a = DotProduct&lt;double,2&gt;(centre,centre);
</code></pre>
<p>folgende Fehlermeldung:</p>
<pre><code>\vector.hpp(213) : error C2248: 'Vector&lt;T,Dimension&gt;::Scalars' : cannot access private member declared in class 'Vector&lt;T,Dimension&gt;'
        with
        [
            T=double,
            Dimension=2
        ]
        \vector.hpp(17) : see declaration of 'Vector&lt;T,Dimension&gt;::Scalars'
        with
        [
            T=double,
            Dimension=2
        ]
        \somevectorusingclass.cpp(71) : see reference to function template instantiation 'T DotProduct&lt;double,2&gt;(const Vector&lt;T,Dimension&gt; &amp;,const Vector&lt;T,Dimension&gt; &amp;)' being compiled
        with
        [
            T=double,
            Dimension=2
        ]
\vector.hpp(213) : error C2248: 'Vector&lt;T,Dimension&gt;::Scalars' : cannot access private member declared in class 'Vector&lt;T,Dimension&gt;'
        with
        [
            T=double,
            Dimension=2
        ]
        \vector.hpp(17) : see declaration of 'Vector&lt;T,Dimension&gt;::Scalars'
        with
        [
            T=double,
            Dimension=2
        ]
</code></pre>
<p>Hab ich mit der friend-deklaration etwas falsch gemacht? Oder habe ich einen kompletten Dekfehler?</p>
<p>Außerdem, warum muss ich beim Aufruf von DotProdukt</p>
<pre><code class="language-cpp">double a = DotProduct&lt;double,2&gt;(centre,centre)
</code></pre>
<p>und nicht nur</p>
<pre><code class="language-cpp">double a = DotProduct(centre,centre)
</code></pre>
<p>schreiben?</p>
<p>(wenn ich es nicht tue, ergibt sich folgender Linker-Fehler:</p>
<pre><code>somevectorusingclass.obj : error LNK2019: unresolved external symbol &quot;double __cdecl DotProduct(class Vector&lt;double,2&gt; const &amp;,class Vector&lt;double,2&gt; const &amp;)&quot; (?DotProduct@@YANABV?$Vector@N$01@@0@Z) referenced in function &quot;public: virtual void __thiscall somevectorusingclass::Draw(int,int,int,int,double,double,double)&quot; (?Draw@somevectorusingclass@@UAEXHHHHNNN@Z)
.exe : fatal error LNK1120: 1 unresolved externals
</code></pre>
<p>Vielen Dank für jede Hilfe! Niko</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/157906/template-vektor-klasse-und-template-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 10:35:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/157906.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Aug 2006 14:28:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to template vektor klasse und template funktionen on Wed, 30 Aug 2006 14:28:22 GMT]]></title><description><![CDATA[<p>So, ich schreibe im Moment zu lernzwecken eine eigene Vektor-Klasse (Vektor als der mathematishen Vektor, nicht als Container).<br />
Da ich ein Problem gerne ein für alle mal löse, dachte ich mir, mach ich ein template für einen n-Dimensionalen Vektor welcher als zusätzliches template-Argument den Typ, welcher zur Speicherung der n Koordinaten benutzt wird, erhält (double, int, float etc.).<br />
Leider treten hierbei Fehler auf, welche ich mir nicht erklären kann (ich habe noch nicht so viel mit templates gearbeitet).</p>
<p>Hier mein Code:</p>
<pre><code class="language-cpp">#if !defined(VECTOR2D_INCLUDED)
#define VECTOR2D_INCLUDED

#if _MSC_VER &gt; 1000
#pragma once
#endif 

#include &quot;Math.hpp&quot;
//#include &lt;cstdio&gt;//??
//#include &lt;cstdlib&gt;//??
#include &lt;cstdarg&gt;

template&lt;class T, int Dimension&gt;
class Vector
{
private:
	T Scalars[Dimension];

protected:

public:
	T GetLength() const
	{
		return sqrt(DotProduct(*this,*this));
	}

	T GetScalar(int dimension) const
	{
		if (dimension&lt;Dimension)
		{
			return Scalars[dimension];
		}
		else
		{
			throw(&quot;bereichsüberschreitung vector getscalar&quot;);
		}
	}

	void SetLength(T length)
	{
		(*this)*=(length/this-&gt;GetLength())
	}
	void Normalize()
	{
		this-&gt;SetLength(1);
	}

	Vector(const Vector&lt;T, Dimension&gt;&amp; vector)
	{
		for (int i = 0; i&lt;Dimension;i++)
		{
			this-&gt;Scalars[i]=vector.Scalars[i];
		}
	}

	Vector()
	{
		for (int i = 0;i&lt;Dimension;++i)
		{
			Scalars[i] = 0;
		}	
	}

	Vector(T scalar, ...)
	{
		Scalars[0] = scalar;
		va_list zeiger;
		va_start(zeiger,scalar);
		for (int i = 0;i+1&lt;Dimension;++i)
		{
			Scalars[i+1] = va_arg(zeiger,int);
		}
	}

	virtual ~Vector()
	{

	}

	Vector&amp; operator= (const Vector&amp; vector)
	{
		for (int i = 0, i&lt;Dimension;i++)
		{
			this-&gt;Scalars[i]=vector.Scalars[i];
		}
	}

	void operator+= (const Vector&amp; vector)		//?????????void???
	{
		for (int i = 0, i&lt;Dimension;i++)
		{
			this-&gt;Scalars[i]+=vector.Scalars[i];
		}
	}

	void operator-= (const Vector&amp; vector)
	{
		for (int i = 0, i&lt;Dimension;i++)
		{
			this-&gt;Scalars[i]-=vector.Scalars[i];
		}
	}

	void operator*= (const T&amp; scalar)
	{
		for (int i = 0, i&lt;Dimension;i++)
		{
			this-&gt;Scalars[i]*=vector.Scalars[i];
		}
	}

	void operator/= (const T&amp; scalar)
	{
		if (scalar==0)
		{
			throw(&quot;also, für Koordinaten geht das nicht, für numerische typen geht das nicht, warum sollte das mit nem vektor gehen? nen unendlich langer vektor? nene, der passt doch nicht auf den Schirm!&quot;);
		}
		else
		{
			for (int i = 0; i&lt;Dimension;i++)
			{
				this-&gt;Scalars[i]/=scalar;
			}
		}
	}
	Vector&lt;T, Dimension&gt; operator/ (const T&amp; right) const
	{
		Vector&lt;T,Dimension&gt; temp;
		if (right == 0)
		{
			throw(&quot;äh nö, auch mit dem Operator gehts gaz dick in die Hose!!!! (aiaiai, dassollte wer aufwischen und zwar schnell!!!!!!&quot;);
		}
		else
		{
			for(int i = 0;i&lt;Dimension;i++)
			{
				temp.Scalars[i]=this-&gt;Scalars[i]/right;
			}
		}
		return temp;
	}

	Vector&lt;T, Dimension&gt; operator* (const T&amp; right) const
	{
		Vector&lt;T,Dimension&gt; temp;
		for(int i = 0;i&lt;Dimension;i++)
		{
			temp.Scalars[i]=this-&gt;Scalars[i]*right;
		}

		return temp;
	}

	Vector&lt;T, Dimension&gt; operator+ (const Vector&lt;T, Dimension&gt;&amp; right)
	{
		Vector&lt;T,Dimension&gt; temp;
		for(int i = 0;i&lt;Dimension;i++)
		{
			temp.Scalars[i]=this-&gt;Scalars[i]+right.Scalars[i];
		}
		return temp;
	}

	Vector&lt;T, Dimension&gt; operator- (const Vector&lt;T, Dimension&gt;&amp; right)
	{
		Vector&lt;T,Dimension&gt; temp;
		for(int i = 0;i&lt;Dimension;i++)
		{
			temp.Scalars[i]=this-&gt;Scalars[i]-right.Scalars[i];
		}

		return temp;
	}

/*friend Vector&lt;T, Dimension&gt; operator- (const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right);
friend Vector&lt;T, Dimension&gt; operator+ (const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right);
*/
friend T DotProduct(const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right);

};

/*template &lt;class T, int Dimension&gt;
Vector&lt;T, Dimension&gt; operator+ (const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right)
{
	Vector&lt;T,Dimension&gt; temp;
	for(int i = 0;i&lt;Dimension;i++)
	{
		temp.Scalars[i]=left.Scalars[i]+right.Scalars[i];
	}
	return temp;
}

template &lt;class T, int Dimension&gt;
Vector&lt;T, Dimension&gt; operator- (const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right)
{
	Vector&lt;T,Dimension&gt; temp;
	for(int i = 0;i&lt;Dimension;i++)
	{
		temp.Scalars[i]=left.Scalars[i]-right.Scalars[i];
	}

	return temp;
}
*/
template &lt;class T, int Dimension&gt;
T DotProduct(const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right)
{
	T result = 0;
	for(int i = 0;i&lt;Dimension;i++)
	{
		result += left.Scalars[i]*right.Scalars[i];
	}

	return result;
}

typedef Vector&lt;double,2&gt; Vector2DDouble;

#endif
</code></pre>
<p>leider ergibt folgende Verwendung:</p>
<pre><code class="language-cpp">Vector&lt;double,2&gt; centre;
				double a = DotProduct&lt;double,2&gt;(centre,centre);
</code></pre>
<p>folgende Fehlermeldung:</p>
<pre><code>\vector.hpp(213) : error C2248: 'Vector&lt;T,Dimension&gt;::Scalars' : cannot access private member declared in class 'Vector&lt;T,Dimension&gt;'
        with
        [
            T=double,
            Dimension=2
        ]
        \vector.hpp(17) : see declaration of 'Vector&lt;T,Dimension&gt;::Scalars'
        with
        [
            T=double,
            Dimension=2
        ]
        \somevectorusingclass.cpp(71) : see reference to function template instantiation 'T DotProduct&lt;double,2&gt;(const Vector&lt;T,Dimension&gt; &amp;,const Vector&lt;T,Dimension&gt; &amp;)' being compiled
        with
        [
            T=double,
            Dimension=2
        ]
\vector.hpp(213) : error C2248: 'Vector&lt;T,Dimension&gt;::Scalars' : cannot access private member declared in class 'Vector&lt;T,Dimension&gt;'
        with
        [
            T=double,
            Dimension=2
        ]
        \vector.hpp(17) : see declaration of 'Vector&lt;T,Dimension&gt;::Scalars'
        with
        [
            T=double,
            Dimension=2
        ]
</code></pre>
<p>Hab ich mit der friend-deklaration etwas falsch gemacht? Oder habe ich einen kompletten Dekfehler?</p>
<p>Außerdem, warum muss ich beim Aufruf von DotProdukt</p>
<pre><code class="language-cpp">double a = DotProduct&lt;double,2&gt;(centre,centre)
</code></pre>
<p>und nicht nur</p>
<pre><code class="language-cpp">double a = DotProduct(centre,centre)
</code></pre>
<p>schreiben?</p>
<p>(wenn ich es nicht tue, ergibt sich folgender Linker-Fehler:</p>
<pre><code>somevectorusingclass.obj : error LNK2019: unresolved external symbol &quot;double __cdecl DotProduct(class Vector&lt;double,2&gt; const &amp;,class Vector&lt;double,2&gt; const &amp;)&quot; (?DotProduct@@YANABV?$Vector@N$01@@0@Z) referenced in function &quot;public: virtual void __thiscall somevectorusingclass::Draw(int,int,int,int,double,double,double)&quot; (?Draw@somevectorusingclass@@UAEXHHHHNNN@Z)
.exe : fatal error LNK1120: 1 unresolved externals
</code></pre>
<p>Vielen Dank für jede Hilfe! Niko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1127675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127675</guid><dc:creator><![CDATA[Sir Niko]]></dc:creator><pubDate>Wed, 30 Aug 2006 14:28:22 GMT</pubDate></item><item><title><![CDATA[Reply to template vektor klasse und template funktionen on Wed, 30 Aug 2006 14:53:48 GMT]]></title><description><![CDATA[<p>EDIT: Ich nehme das zurück. War oberflächlich gelesen und Quatsch.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1127696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127696</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 30 Aug 2006 14:53:48 GMT</pubDate></item><item><title><![CDATA[Reply to template vektor klasse und template funktionen on Wed, 30 Aug 2006 15:39:46 GMT]]></title><description><![CDATA[<p>durch</p>
<pre><code class="language-cpp">friend T DotProduct(const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right);
</code></pre>
<p>deklarierst du eine funktion DotProduct, die keine templatefunktion ist. solange diese funktion nicht redeklariert wird, ist sie zwar nicht durch normales lookup, wohl aber durch Koenig-lookup in einem funktionsaufruf auffindbar. und genau das passiert in:</p>
<pre><code class="language-cpp">DotProduct(centre,centre)
</code></pre>
<p>DotProduct&lt;double,2&gt; wäre für diesen ausdruck gleichgut - in diesen fällen wird aber die funktion, die keine templatefunktion ist, vorgezogen. die overload-auflösung entscheidet sich also für die funktion, die in der friend-deklaration deklariert wird - und in folge kommt es dann zu einem linker-fehler, denn besagte funktion wird nie definiert.</p>
<p>was du willst, ist wohl, entweder das template DotProdukt</p>
<pre><code class="language-cpp">template&lt;class T, int Dimension&gt;
class Vector
{
// ...
template &lt;class, int&gt;
friend T DotProduct(const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right);
};
</code></pre>
<p>oder nur eine bestimmte instanz davon (diejenige mit übereinstimmenden templateargumenten) als friend zu deklarieren. da sich letzteres allerdings auf eine spezialisierung bezieht, muss das primärtemplate vorher deklariert werden.</p>
<pre><code class="language-cpp">template&lt;class T, int Dimension&gt;
class Vector;
template &lt;class T, int Dimension&gt;
T DotProduct(const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right);
template&lt;class T, int Dimension&gt;
class Vector
{
// ...
friend T DotProduct&lt;T, Dimension&gt;(const Vector&lt;T, Dimension&gt;&amp; left, const Vector&lt;T, Dimension&gt;&amp; right);
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1127718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127718</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 30 Aug 2006 15:39:46 GMT</pubDate></item><item><title><![CDATA[Reply to template vektor klasse und template funktionen on Wed, 30 Aug 2006 16:48:26 GMT]]></title><description><![CDATA[<p>Dabke camper, für die schnelle antwort, ja, die 2. Variante war es, die ich brauche.</p>
<p>P.s.: Hast du den Beitrag gerade editiert? Die war doch eben anders, da gab das ne Fehlermeldung, das wollt ich gerade tippen, aber so wies jetzt da steht funzts wunderbar, danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1127787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1127787</guid><dc:creator><![CDATA[Sir Niko]]></dc:creator><pubDate>Wed, 30 Aug 2006 16:48:26 GMT</pubDate></item></channel></rss>