<?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[Templates mit Zeigern]]></title><description><![CDATA[<p>Ich habe von einem Freund gerade folgende C++ Code-Schnipsel geschickt bekommen.<br />
Nachdem eine vorherige Version ewig nicht ging, funktioniert die hier gepostete:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void foo(const T &amp;t)
{
}

void foobar(const int *i)
{
    // leere Typangabe????
    foo&lt;&gt;(i);
    // alternativ auch foo(i)
}

int main()
{
	int i=6;

	foobar(&amp;i);

	return 0;
}
</code></pre>
<p>Leider reicht mein bescheidenes Wissen nicht aus, warum man bei foo nichts angeben kann / darf. Der Compiler holt sich das wohl von selber heißt es.<br />
Kann mir jemand eine Fachtechnische Antwort geben?</p>
<p>Was müsste man denn alternativ für den oben aufgeführten Fall eines int* angeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/260159/templates-mit-zeigern</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 12:55:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/260159.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 01 Feb 2010 18:23:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templates mit Zeigern on Mon, 01 Feb 2010 18:23:17 GMT]]></title><description><![CDATA[<p>Ich habe von einem Freund gerade folgende C++ Code-Schnipsel geschickt bekommen.<br />
Nachdem eine vorherige Version ewig nicht ging, funktioniert die hier gepostete:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void foo(const T &amp;t)
{
}

void foobar(const int *i)
{
    // leere Typangabe????
    foo&lt;&gt;(i);
    // alternativ auch foo(i)
}

int main()
{
	int i=6;

	foobar(&amp;i);

	return 0;
}
</code></pre>
<p>Leider reicht mein bescheidenes Wissen nicht aus, warum man bei foo nichts angeben kann / darf. Der Compiler holt sich das wohl von selber heißt es.<br />
Kann mir jemand eine Fachtechnische Antwort geben?</p>
<p>Was müsste man denn alternativ für den oben aufgeführten Fall eines int* angeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848751</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Mon, 01 Feb 2010 18:23:17 GMT</pubDate></item><item><title><![CDATA[Reply to Templates mit Zeigern on Mon, 01 Feb 2010 18:26:55 GMT]]></title><description><![CDATA[<p>BasicMan01 schrieb:</p>
<blockquote>
<p>Was müsste man denn alternativ für den oben aufgeführten Fall eines int* angeben?</p>
</blockquote>
<p>Eigentlich <em>const int</em>*. Aber wieso sollte man das wollen? Der Compiler nimmt dir doch dir Arbeit in dem Fall ab!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848755</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 01 Feb 2010 18:26:55 GMT</pubDate></item><item><title><![CDATA[Reply to Templates mit Zeigern on Mon, 01 Feb 2010 18:34:44 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Aber wieso sollte man das wollen?</p>
</blockquote>
<p>Gute Frage. Würde ja letztendlich bedeuten, dass man bei Templates die Typangabe<br />
GRUNSÄTZLICH? weglassen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848759</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Mon, 01 Feb 2010 18:34:44 GMT</pubDate></item><item><title><![CDATA[Reply to Templates mit Zeigern on Mon, 01 Feb 2010 18:39:06 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Aber wieso sollte man das wollen? Der Compiler nimmt dir doch dir Arbeit in dem Fall ab!</p>
</blockquote>
<p>Z. B., wenn man sowas hier hat:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class foo
{
    public:
        void bar(const T &amp;t) const
        {
            // mach was mit t
        }
};

void foobar(const int *i)
{
    foo&lt;int *&gt; f;

    f.bar(i);
}
</code></pre>
<p>Wieso meckert er da? Für mich wäre das Ergebnis bei foo&lt;int *&gt; eine Instanz von foo&lt;int *&gt; mit der Methode:</p>
<pre><code class="language-cpp">void bar(const int * &amp;t) const
</code></pre>
<p>Für den Compiler scheinbar nicht, wieso?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848763</guid><dc:creator><![CDATA[Max0r]]></dc:creator><pubDate>Mon, 01 Feb 2010 18:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to Templates mit Zeigern on Mon, 01 Feb 2010 18:43:46 GMT]]></title><description><![CDATA[<p>Nein, nur wenn der Compiler den Typ auflösen kann! Zum Beispiel geht das bei Rückgabetypen (oft) nicht:</p>
<pre><code class="language-cpp">template&lt;typename R, typename T&gt;
R foo( const T&amp; bla )
{
  R xyz = ...
  return xyz;
}

template&lt;typename T, typename R&gt;
R bar( const T&amp; bla )
{
  R xyz = ...;
  return xyz;
}

int x = foo( 42 ); // nein!
int x = foo&lt;int&gt;( 42 ); // ja!
int x = foo&lt;int, int&gt;( 42 ); // ja!
int x = bar( 42 ); // nein!
int x = bar&lt;int&gt;( 42 ); // nein!
int x = bar&lt;int, int&gt;( 42 );
</code></pre>
<p>@ Max0r:<br />
Schreib statt dessen:</p>
<pre><code class="language-cpp">void bar(T const &amp;t) const
</code></pre>
<p>dann ist die syntaktische Unklarheit eigentlich beseitigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848764</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 01 Feb 2010 18:43:46 GMT</pubDate></item><item><title><![CDATA[Reply to Templates mit Zeigern on Mon, 01 Feb 2010 18:44:00 GMT]]></title><description><![CDATA[<p>Nur, wenn die Template-Parameter auch Parameter der Funktion sind, d.h. für den Rückgabetyp gilt dies nicht:</p>
<pre><code class="language-cpp">template&lt;class T&gt; string toStr(const T&amp; t)
{
	std::ostringstream str;

	str &lt;&lt; t;

	return str.str();
}

template&lt;class T&gt; T fromStr(const string&amp; s, const T&amp; def = T())
{
	std::istringstream str(s);
	T t = def;

	str &gt;&gt; t;

	return t;
}

int main()
{
  string s = toStr(42); // automatische Herleitung (sogar die &lt;&gt; können weggelassen werden)

  int x = fromStr&lt;int&gt;(&quot;42&quot;); // der Rückgabetyp muß angegeben werden
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1848769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848769</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Mon, 01 Feb 2010 18:44:00 GMT</pubDate></item><item><title><![CDATA[Reply to Templates mit Zeigern on Mon, 01 Feb 2010 18:46:34 GMT]]></title><description><![CDATA[<p>Max0r schrieb:</p>
<blockquote>
<p>Wieso meckert er da? Für mich wäre das Ergebnis bei foo&lt;int *&gt; eine Instanz von foo&lt;int *&gt; mit der Methode:</p>
<pre><code class="language-cpp">void bar(const int * &amp;t) const
</code></pre>
<p>Für den Compiler scheinbar nicht, wieso?</p>
</blockquote>
<p>Das ist</p>
<pre><code class="language-cpp">void bar(int* const&amp; t) const
</code></pre>
<p>womit sich die Frage von selbst beantworten sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848770</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 01 Feb 2010 18:46:34 GMT</pubDate></item><item><title><![CDATA[Reply to Templates mit Zeigern on Mon, 01 Feb 2010 19:01:33 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>@ Max0r:<br />
Schreib statt dessen:</p>
<pre><code class="language-cpp">void bar(T const &amp;t) const
</code></pre>
<p>dann ist die syntaktische Unklarheit eigentlich beseitigt.</p>
</blockquote>
<p>Da kommt der gleiche Compilerfehler wie bei const T &amp;t</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848784</guid><dc:creator><![CDATA[Max0r]]></dc:creator><pubDate>Mon, 01 Feb 2010 19:01:33 GMT</pubDate></item><item><title><![CDATA[Reply to Templates mit Zeigern on Mon, 01 Feb 2010 19:06:19 GMT]]></title><description><![CDATA[<p>Logisch kommt der gleiche Fehler. Der Compiler hat im allgemeinen keine Interpretationsprobleme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848787</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 01 Feb 2010 19:06:19 GMT</pubDate></item><item><title><![CDATA[Reply to Templates mit Zeigern on Mon, 01 Feb 2010 19:06:47 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Logisch kommt der gleiche Fehler. Der Compiler hat im allgemeinen keine Probleme damit die Syntax richtig zu interpretieren! <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>
</blockquote>
<p>Ich wäre sehr dankbar für eine Erklärung, wieso das falsch ist und wie es richtig geschrieben wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848788</guid><dc:creator><![CDATA[Max0r]]></dc:creator><pubDate>Mon, 01 Feb 2010 19:06:47 GMT</pubDate></item><item><title><![CDATA[Reply to Templates mit Zeigern on Mon, 01 Feb 2010 19:08:41 GMT]]></title><description><![CDATA[<p>Camper hats ja schon geschrieben, aber nochmal:</p>
<pre><code class="language-cpp">void bar(const T &amp;t) const
</code></pre>
<p>mit T = int* ist:</p>
<pre><code class="language-cpp">void bar( int* const&amp; t ) const
</code></pre>
<p>Wenn du aber schreibst:</p>
<pre><code class="language-cpp">void bar( T const&amp; t ) const
</code></pre>
<p>ist auf den ersten Blick klar was passiert wenn du T substituierst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848791</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 01 Feb 2010 19:08:41 GMT</pubDate></item><item><title><![CDATA[Reply to Templates mit Zeigern on Mon, 01 Feb 2010 19:15:57 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Camper hats ja schon geschrieben, aber nochmal:</p>
<pre><code class="language-cpp">void bar(const T &amp;t) const
</code></pre>
<p>mit T = int* ist:</p>
<pre><code class="language-cpp">void bar( int* const&amp; t ) const
</code></pre>
<p>Wenn du aber schreibst:</p>
<pre><code class="language-cpp">void bar( T const&amp; t ) const
</code></pre>
<p>ist auf den ersten Blick klar was passiert wenn du T substituierst.</p>
</blockquote>
<p>Wenn der Compiler an der Stelle das einsetzt, was ich ans Template übergeb, kommt für mich aber trotzdem raus:</p>
<pre><code class="language-cpp">void bar(const T &amp;t) const
</code></pre>
<p>wird zu:</p>
<pre><code class="language-cpp">void bar(const const int * &amp;t) const
</code></pre>
<p>Ein Template is doch ne Schablone, wo an den entsprechenden Stellen meine Template-Parameter eingesetzt werden. Oder net?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848796</guid><dc:creator><![CDATA[Max0r]]></dc:creator><pubDate>Mon, 01 Feb 2010 19:15:57 GMT</pubDate></item><item><title><![CDATA[Reply to Templates mit Zeigern on Mon, 01 Feb 2010 19:22:49 GMT]]></title><description><![CDATA[<p>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848799</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 01 Feb 2010 19:22:49 GMT</pubDate></item><item><title><![CDATA[Reply to Templates mit Zeigern on Mon, 01 Feb 2010 19:23:20 GMT]]></title><description><![CDATA[<p>also mittlerweile denk ich, dass man lieber</p>
<pre><code class="language-cpp">void bar(T const &amp;t) const
{
}

als

void bar(const T &amp;t) const
{
}
</code></pre>
<p>schreiben sollte, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848800</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Mon, 01 Feb 2010 19:23:20 GMT</pubDate></item><item><title><![CDATA[Reply to Templates mit Zeigern on Mon, 01 Feb 2010 19:25:01 GMT]]></title><description><![CDATA[<p>BasicMan01 schrieb:</p>
<blockquote>
<p>also mittlerweile denk ich, dass man lieber</p>
<pre><code class="language-cpp">void bar(T const &amp;t) const
{
}

als

void bar(const T &amp;t) const
{
}
</code></pre>
<p>schreiben sollte, oder?</p>
</blockquote>
<p>Zumindest entstehen dann nicht diese Verwirrtheiten! <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/1848802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848802</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 01 Feb 2010 19:25:01 GMT</pubDate></item></channel></rss>