<?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[static Methode in template Klasse]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte eine static Methode in einer template Klasse haben:</p>
<pre><code class="language-cpp">namespace nml {

template &lt;class T&gt;
class Vector {
	private:
		T* data_;
		unsigned int size_;

	public:
		template &lt;class T1, class T2&gt;
		static double ScalarProduct(Vector&lt;T1&gt; v1, Vector&lt;T2&gt; v2);
};

template &lt;class T&gt;
template &lt;class T1, class T2&gt;
static double Vector&lt;T&gt;::ScalarProduct(Vector&lt;T1&gt; v1, Vector&lt;T2&gt; v2) {
	return 0.0;
}

}
</code></pre>
<p>Damit bekomme ich aber folgende Fehlermeldung:<br />
Elementfunktion »static double nml::Vector&lt;T&gt;::ScalarProduct(nml::Vector&lt;T1&gt;, nml::Vector&lt;T2&gt;)« kann nicht deklariert werden, statische Bindung zu haben</p>
<p>Warum geht das nicht?, oder was hab ich falsch gemacht?</p>
<p>Ich danke euch schonmal für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/217849/static-methode-in-template-klasse</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 07:03:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/217849.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 12 Jul 2008 11:01:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to static Methode in template Klasse on Sat, 12 Jul 2008 11:01:21 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte eine static Methode in einer template Klasse haben:</p>
<pre><code class="language-cpp">namespace nml {

template &lt;class T&gt;
class Vector {
	private:
		T* data_;
		unsigned int size_;

	public:
		template &lt;class T1, class T2&gt;
		static double ScalarProduct(Vector&lt;T1&gt; v1, Vector&lt;T2&gt; v2);
};

template &lt;class T&gt;
template &lt;class T1, class T2&gt;
static double Vector&lt;T&gt;::ScalarProduct(Vector&lt;T1&gt; v1, Vector&lt;T2&gt; v2) {
	return 0.0;
}

}
</code></pre>
<p>Damit bekomme ich aber folgende Fehlermeldung:<br />
Elementfunktion »static double nml::Vector&lt;T&gt;::ScalarProduct(nml::Vector&lt;T1&gt;, nml::Vector&lt;T2&gt;)« kann nicht deklariert werden, statische Bindung zu haben</p>
<p>Warum geht das nicht?, oder was hab ich falsch gemacht?</p>
<p>Ich danke euch schonmal für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546112</guid><dc:creator><![CDATA[olibats]]></dc:creator><pubDate>Sat, 12 Jul 2008 11:01:21 GMT</pubDate></item><item><title><![CDATA[Reply to static Methode in template Klasse on Sat, 12 Jul 2008 11:43:14 GMT]]></title><description><![CDATA[<p>Das Schlüsselwort <strong>static</strong> nur in der Deklaration innerhalb des Klassenrumpfes verwenden. Bei der Definition außerhalb weglassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546140</guid><dc:creator><![CDATA[zolibat]]></dc:creator><pubDate>Sat, 12 Jul 2008 11:43:14 GMT</pubDate></item><item><title><![CDATA[Reply to static Methode in template Klasse on Sat, 12 Jul 2008 12:33:46 GMT]]></title><description><![CDATA[<p>Vielen Dank für die schnelle Antwort. So einfach kanns sein.</p>
<p>Da hab ich gleich noch eine Frage zum Aufruf der static-Methode</p>
<pre><code class="language-cpp">nml::Vector&lt;int&gt; v(8);
nml::Vector&lt;int&gt; u(8);
double test = nml::Vector&lt;int&gt;::ScalarProduct(u,v);
</code></pre>
<p>Kann man ScalarProduct auch irgendwie ohne Angabe des Templatearguments (hier int) aufrufen?, die Methode hängt von diesem ja eigentlich nicht ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546171</guid><dc:creator><![CDATA[olibats]]></dc:creator><pubDate>Sat, 12 Jul 2008 12:33:46 GMT</pubDate></item><item><title><![CDATA[Reply to static Methode in template Klasse on Sat, 12 Jul 2008 13:14:39 GMT]]></title><description><![CDATA[<p>Mach <code>ScalarProdukt</code> doch als freie Funktion und dem Vektor gibts du eine Methode, mit welcher man auf die einzelnen Elemente zugreifen kann.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546190</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 12 Jul 2008 13:14:39 GMT</pubDate></item><item><title><![CDATA[Reply to static Methode in template Klasse on Sat, 12 Jul 2008 13:40:46 GMT]]></title><description><![CDATA[<p>Du meinst also, ich soll das ScalarProduct aus der Klasse raus nehmen?<br />
Ist das nicht irgendwie blöd, weil semantisch gehört das SkalarProdukt doch zu den Vektoren. Deshalb wollte ichs eigentlich in der Klasse kapseln.</p>
<p>Aber ich hab jetzt halt Probleme damit:</p>
<pre><code class="language-cpp">nml::Vector&lt;int&gt; v(8);
nml::Vector&lt;float&gt; u(8);
nml::Vector&lt;int&gt;::ScalarProduct(u,v)
</code></pre>
<p>Ich kann im SkalarProdukt nicht auf die privaten Member von u zugreifen, weil u ein float-Vector ist.<br />
Wie könnte man denn festlegen, dass alle Vector-Klassen(unabh. vom Templateargument) gegenseitig friends sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546201</guid><dc:creator><![CDATA[olibats]]></dc:creator><pubDate>Sat, 12 Jul 2008 13:40:46 GMT</pubDate></item><item><title><![CDATA[Reply to static Methode in template Klasse on Sat, 12 Jul 2008 13:52:43 GMT]]></title><description><![CDATA[<p>olibats schrieb:</p>
<blockquote>
<p>Du meinst also, ich soll das ScalarProduct aus der Klasse raus nehmen?</p>
</blockquote>
<p>Genau! Sonst definierst du nämlich auch zig Funktionen. Beispiel:</p>
<pre><code class="language-cpp">nml::Vector&lt;int&gt; v(8);
nml::Vector&lt;int&gt; u(8);
double test;

test = nml::Vector&lt;int&gt;::ScalarProduct(u,v);
test = nml::Vector&lt;long&gt;::ScalarProduct(u,v);
</code></pre>
<p>Die beiden Funktionen machen das gleiche und haben die gleichen Parameter, sind aber nicht die gleichen Funktionen, da sie in unterschiedlichen Templateklassen sind! Daher eigentlich völliger Unsinn!</p>
<p>olibats schrieb:</p>
<blockquote>
<p>Ist das nicht irgendwie blöd, weil semantisch gehört das SkalarProdukt doch zu den Vektoren. Deshalb wollte ichs eigentlich in der Klasse kapseln.</p>
</blockquote>
<p>Wieso? Das Produkt hat nichts mit dem Vektor zu tun, das sind zwei unterschiedliche Dinge, welche man ganz klar voneinander trennen sollte. Schau dir als Beispiel die mathematischen Funktionen aus der Standardbibliothek an, das sind alles freie Funktionen und sind nicht irgendeinem Typ zugeordnet.</p>
<p>olibats schrieb:</p>
<blockquote>
<p>Ich kann im SkalarProdukt nicht auf die privaten Member von u zugreifen, weil u ein float-Vector ist.<br />
Wie könnte man denn festlegen, dass alle Vector-Klassen(unabh. vom Templateargument) gegenseitig friends sind?</p>
</blockquote>
<p>Wie ich schon vorhin geschrieben habe, brauchst du halt entsprechendet getter und setter.</p>
<pre><code class="language-cpp">int Vector&lt;T&gt;::count_elements() const;
T const&amp; Vector&lt;T&gt;::get_element(int iID) const;
void Vector&lt;T&gt;::set_element(int iID, T const&amp; rT);
</code></pre>
<p>Oder so ähnlich. Um die ist man auch sonst froh!</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546205</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 12 Jul 2008 13:52:43 GMT</pubDate></item><item><title><![CDATA[Reply to static Methode in template Klasse on Sat, 12 Jul 2008 14:10:35 GMT]]></title><description><![CDATA[<p>OK, ich nehms aus der Klasse raus.</p>
<p>Ist das nicht ein Geschwindigkeitsnachteil, wenn ich auf jedes Element einzeln mit Get und Set zugreife?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546212</guid><dc:creator><![CDATA[olibats]]></dc:creator><pubDate>Sat, 12 Jul 2008 14:10:35 GMT</pubDate></item><item><title><![CDATA[Reply to static Methode in template Klasse on Sat, 12 Jul 2008 14:27:08 GMT]]></title><description><![CDATA[<p>olibats schrieb:</p>
<blockquote>
<p>Ist das nicht ein Geschwindigkeitsnachteil, wenn ich auf jedes Element einzeln mit Get und Set zugreife?</p>
</blockquote>
<p>Wenn du die Getter und Setter inline machst, dann eher nicht. Sowieso ist sowas an der falschen Stelle gespart, das macht extrem wenig aus.<br />
Und wie würdest du es sonst macht? Du musst ja auch irgendwie auf die Elemente zugreifen. Ob das nun über eine Funktion passiert oder du direkt auf die Variablen zugreifst, dass ist so minim, dass es gar nicht messbar ist.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546225</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 12 Jul 2008 14:27:08 GMT</pubDate></item><item><title><![CDATA[Reply to static Methode in template Klasse on Sat, 12 Jul 2008 14:31:18 GMT]]></title><description><![CDATA[<p>Japp, ist es...</p>
<p>Ist zu vergleichen mit so was:</p>
<pre><code class="language-cpp">std::vector &lt;int&gt; arr (100);

for (size_t i (0); i != 100; ++i)
{
arr[i];
}

for (std::vector &lt;int&gt;::iterator i (arr.begin ()), end (arr.end ()); i != end; ++i)
{
*i;
}
</code></pre>
<p>Aber falls du die Vectoren bis jetzt auch nicht mit iteratoren durchgehst (oder sie nicht x-millionen-dimensionen haben sollte man das vernachlässigen können...</p>
<p>Für so was könnte man halt auch einfach 2 Public-Wrapper-Funktionen schreiben, wenn es sich später rausstellt, dass es jz viel zu langsam ist...</p>
<pre><code class="language-cpp">class xyz
{
private:
std::vector &lt;int&gt; arr;
public:
std::vector &lt;int&gt;::iterator GetFirst () {arr.begin ();};
std::vector &lt;int&gt;::iterator GetEnd () {arr.end ();};
}
</code></pre>
<p>dann sollte es eigtl keinen Unterschied mehr machen...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546227</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 12 Jul 2008 14:31:18 GMT</pubDate></item><item><title><![CDATA[Reply to static Methode in template Klasse on Sat, 12 Jul 2008 14:47:38 GMT]]></title><description><![CDATA[<p>Meine Idee wäre sonst noch gewesen, die SkalarProdukt-Methode als friend von der Vektor-Klasse zu definieren. Damit könnte ich dann direkt mit dem privaten Pointer arbeiten.<br />
Bei den gettern und settern gibts eben bei jedem Zugriff einen Funktionsaufruf.<br />
Aber mit inline müsste das natürlich gehen.</p>
<p>Ich werde es gleich mal ausprobieren.</p>
<p>Vielen Dank euch erstmal für die Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546245</guid><dc:creator><![CDATA[olibats]]></dc:creator><pubDate>Sat, 12 Jul 2008 14:47:38 GMT</pubDate></item></channel></rss>