<?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 member function spezialisieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klasse</p>
<pre><code class="language-cpp">class A
{
	template&lt;typename R&gt; R f() const;
};
</code></pre>
<p>und würde gerne f() so spezialisieren, dass obige Definition äquivalent zu</p>
<pre><code class="language-cpp">class A
{
	int f() const { return 0; }
};
</code></pre>
<p>wird. Ich habe es mit</p>
<pre><code class="language-cpp">template&lt;&gt; int A::f&lt;int&gt;() { return 0; }
</code></pre>
<p>versucht, erhalte aber die Fehlermeldung</p>
<pre><code class="language-cpp">../src/scratch.cpp:3: error: template-id ‘f&lt;int&gt;’ for ‘int A::f()’ does
make: *** [src/scratch.o] Error 1
    not match any template declaration
</code></pre>
<p>Sinn und Zweck des Ganzen soll sein, Funktionen bezüglich ihres Rückgabewertes zu überladen. Also zusätzlich noch sowas wie</p>
<pre><code class="language-cpp">template&lt;&gt; double A::f&lt;double&gt;() { return 1; }
</code></pre>
<p>zu haben und dann</p>
<pre><code class="language-cpp">A a;
a.f&lt;int&gt;();
a.f&lt;double&gt;();
</code></pre>
<p>schreiben zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277511/template-member-function-spezialisieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 15:35:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277511.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 19 Nov 2010 17:32:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template member function spezialisieren on Fri, 19 Nov 2010 17:32:47 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klasse</p>
<pre><code class="language-cpp">class A
{
	template&lt;typename R&gt; R f() const;
};
</code></pre>
<p>und würde gerne f() so spezialisieren, dass obige Definition äquivalent zu</p>
<pre><code class="language-cpp">class A
{
	int f() const { return 0; }
};
</code></pre>
<p>wird. Ich habe es mit</p>
<pre><code class="language-cpp">template&lt;&gt; int A::f&lt;int&gt;() { return 0; }
</code></pre>
<p>versucht, erhalte aber die Fehlermeldung</p>
<pre><code class="language-cpp">../src/scratch.cpp:3: error: template-id ‘f&lt;int&gt;’ for ‘int A::f()’ does
make: *** [src/scratch.o] Error 1
    not match any template declaration
</code></pre>
<p>Sinn und Zweck des Ganzen soll sein, Funktionen bezüglich ihres Rückgabewertes zu überladen. Also zusätzlich noch sowas wie</p>
<pre><code class="language-cpp">template&lt;&gt; double A::f&lt;double&gt;() { return 1; }
</code></pre>
<p>zu haben und dann</p>
<pre><code class="language-cpp">A a;
a.f&lt;int&gt;();
a.f&lt;double&gt;();
</code></pre>
<p>schreiben zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982999</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Fri, 19 Nov 2010 17:32:47 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Fri, 19 Nov 2010 17:39:26 GMT]]></title><description><![CDATA[<p>ingobulla schrieb:</p>
<blockquote>
<p>Sinn und Zweck des Ganzen soll sein, Funktionen bezüglich ihres Rückgabewertes zu überladen.</p>
</blockquote>
<p>Wozu das? Für einzelne Fälle kann das sinnvoll sein (wobei es sich bei dir nicht um Überladung handelt, da diese implizit geschieht), doch im Allgemeinen ist ein Cast auf User-Seite wohl angebrachter. Oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983009</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 19 Nov 2010 17:39:26 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Fri, 19 Nov 2010 18:34:32 GMT]]></title><description><![CDATA[<p>Versuchst du f&lt;int&gt; in scratch.cpp zu spezialisieren, während die Deklaration in der Klassedefinition in scretch.hpp ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983041</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Fri, 19 Nov 2010 18:34:32 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Fri, 19 Nov 2010 21:26:06 GMT]]></title><description><![CDATA[<p>Soweit ich weiss dürfen member Funktionen nicht spezialisiert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983074</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 19 Nov 2010 21:26:06 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Fri, 19 Nov 2010 22:01:13 GMT]]></title><description><![CDATA[<p>Klar darf man Methodenvorlagen spezialisieren. Das Problem in diesem Fall ist, dass die Signatur nicht übereinstimmt.</p>
<pre><code class="language-cpp">template&lt;&gt; int A::f&lt;int&gt;() /* --&gt; */ const /* &lt;-- */ { return 0; }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1983077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983077</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 19 Nov 2010 22:01:13 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Sat, 20 Nov 2010 00:07:05 GMT]]></title><description><![CDATA[<p>Ich kann nur raten allgemein vom Spezialisieren von Funktionen die Finger zu lassen, und stattdessen Helper-Klassen-Templates mit statischen Funktionen zu verwenden.</p>
<p>Das Funktions-Template leitet dann einfach an die statische Funktion des Helper-Klassen-Templates weiter, und spezialisiert wird immer nur die Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983107</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 20 Nov 2010 00:07:05 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Sat, 20 Nov 2010 00:14:19 GMT]]></title><description><![CDATA[<p>Why Not Specialize Function Templates?: <a href="http://www.gotw.ca/publications/mill17.htm" rel="nofollow">http://www.gotw.ca/publications/mill17.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983110</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sat, 20 Nov 2010 00:14:19 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Sat, 20 Nov 2010 09:45:15 GMT]]></title><description><![CDATA[<p>Er spezialisiert hier aber den Rückgabetyp. Die Methode f kann man gar nicht überladen (ohne ihr zusätzliche Argumente zu verpassen). Ansonsten ist es aber richtig, dass man überladen sollte statt zu spezialisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983149</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sat, 20 Nov 2010 09:45:15 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Sat, 20 Nov 2010 11:07:20 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Er spezialisiert hier aber den Rückgabetyp. Die Methode f kann man gar nicht überladen (ohne ihr zusätzliche Argumente zu verpassen). Ansonsten ist es aber richtig, dass man überladen sollte statt zu spezialisieren.</p>
</blockquote>
<p>Und wenn man sie so aufruft?</p>
<pre><code class="language-cpp">A a;
cout &lt;&lt; a.f&lt;double&gt;() &lt;&lt; &quot;\n&quot;;
cout &lt;&lt; a.f&lt;int&gt;()&lt;&lt; &quot;\n&quot;;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1983178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983178</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sat, 20 Nov 2010 11:07:20 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Sat, 20 Nov 2010 21:00:39 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Er spezialisiert hier aber den Rückgabetyp. Die Methode f kann man gar nicht überladen (ohne ihr zusätzliche Argumente zu verpassen).</p>
</blockquote>
<p>Ich weiss nicht was du jetzt mit &quot;zusätzliche Argumente zu verpassen&quot; meinst, Funktions-Parameter oder Template-Parameter. Es geht auf jeden Fall beides so weit ich weiss:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

class A
{
public:

	template &lt;class R&gt;
	R f()
	{
		return R();
	}

	// overload
	template &lt;class R, size_t N&gt;
	std::vector&lt;R&gt; f()
	{
		return std::vector&lt;R&gt;(N);
	}

	// another overload
	template &lt;class R&gt;
	std::vector&lt;R&gt; f(size_t N)
	{
		return std::vector&lt;R&gt;(N);
	}
};

int main(int argc, char** argv)
{
	A a;

	int i = a.f&lt;int&gt;();
	std::vector&lt;int&gt; v1 = a.f&lt;int, 10&gt;();
	std::vector&lt;int&gt; v2 = a.f&lt;int&gt;(10);

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1983451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983451</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 20 Nov 2010 21:00:39 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Sat, 20 Nov 2010 21:01:37 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>brotbernd schrieb:</p>
<blockquote>
<p>Er spezialisiert hier aber den Rückgabetyp. Die Methode f kann man gar nicht überladen (ohne ihr zusätzliche Argumente zu verpassen). Ansonsten ist es aber richtig, dass man überladen sollte statt zu spezialisieren.</p>
</blockquote>
<p>Und wenn man sie so aufruft?</p>
<pre><code class="language-cpp">A a;
cout &lt;&lt; a.f&lt;double&gt;() &lt;&lt; &quot;\n&quot;;
cout &lt;&lt; a.f&lt;int&gt;()&lt;&lt; &quot;\n&quot;;
</code></pre>
</blockquote>
<p>Was soll dann sein, ich verstehe die Frage nicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983452</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 20 Nov 2010 21:01:37 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Mon, 22 Nov 2010 12:02:54 GMT]]></title><description><![CDATA[<p>Danke für all die Rückmeldungen.</p>
<p>Ich denke, ich sollte hier mal das eigentliche Problem schildern (es scheint mir wahrscheinlich häufiger aufzutreten, daher wird jemand wohl wissen, mit welcher Technik es am besten zu lösen ist).</p>
<p>Ich habe zwei Template-Klassen</p>
<pre><code class="language-cpp">template&lt;class N&gt; class A
{
public:
	virtual N* unspec_node() const = 0;
	...
};

template&lt;class N, class ON&gt; class B : public virtual A&lt;N&gt;
{
private:
	ON* m_node;
public:
	ON* node() const { return m_node; }
	N* unspec_node() const { return m_node; }
	...
};
</code></pre>
<p>Das Problem ist nun, dass ich in der Klasse B eine Methode node() habe, die einen Knoten zurückgibt, und eine Methode unspec_node(), die einen unspezifischen Knoten zurückgibt (ON ist aus N abgeleitet). Ich frage mich nun, ob man die Benennung der Methoden konsistenter machen kann, dass ich statt</p>
<pre><code class="language-cpp">B&lt;C_N, C_ON&gt; b;
b-&gt;node();
b-&gt;unspec_node()
</code></pre>
<p>irgendwas verständlicheres in der Richtung</p>
<pre><code class="language-cpp">B&lt;C_N, C_ON&gt; b;
b-&gt;node&lt;C_N&gt;();
b-&gt;node&lt;C_ON&gt;();
</code></pre>
<p>schreiben kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984102</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Mon, 22 Nov 2010 12:02:54 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Mon, 22 Nov 2010 13:55:31 GMT]]></title><description><![CDATA[<p>Du kannst es einfach so machen:</p>
<pre><code class="language-cpp">template&lt;class N&gt; class A
{
public:
    virtual N* node() const = 0;
    ...
};

template&lt;class N, class ON&gt; class B : public virtual A&lt;N&gt;
{
private:
    ON* m_node;
public:
    ON* node() const { return m_node; } // implementiert A::node, wenn ON von N abgeleitet ist!
    ...
};
</code></pre>
<p>C++ kann covariant return values bei virtuellen Funktionen (ein oft übersehenes Feature).</p>
<p>MSVC 6 frisst solchen Code noch nicht, ab MSVC 7.0 (2002) geht es dann aber.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984158</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 22 Nov 2010 13:55:31 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Tue, 23 Nov 2010 10:20:49 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Du kannst es einfach so machen:</p>
<pre><code class="language-cpp">template&lt;class N&gt; class A
{
public:
    virtual N* node() const = 0;
    ...
};

template&lt;class N, class ON&gt; class B : public virtual A&lt;N&gt;
{
private:
    ON* m_node;
public:
    ON* node() const { return m_node; } // implementiert A::node, wenn ON von N abgeleitet ist!
    ...
};
</code></pre>
<p>C++ kann covariant return values bei virtuellen Funktionen (ein oft übersehenes Feature).</p>
<p>MSVC 6 frisst solchen Code noch nicht, ab MSVC 7.0 (2002) geht es dann aber.</p>
</blockquote>
<p>Danke, dass wusste ich noch nicht. Allerdings bekomme ich, wenn ich das bei mir versuche, die Fehlermeldung (relevanter Teil nach der Leerzeile)</p>
<pre><code class="language-cpp">../src/node_container/base_nc.h: In instantiation of ‘NC_with_1_Nd&lt;
        Sim_Nd, Sim_Tip_Nd, Sim_NC, Sim_Intern_NC, Sim_Tree&gt;’:
../src/node_container/base_nc.h:204:   instantiated from ‘Tip_NC&lt;
        Sim_Nd, Sim_Tip_Nd, Sim_NC, Sim_Intern_NC, Sim_Tree&gt;’
../src/node_container/sim_nc.h:44:   instantiated from here

../src/node_container/base_nc.h:140: error: invalid covariant return type for
    ‘Sim_Tip_Nd * NC_with_1_Nd&lt;
        Sim_Nd, Sim_Tip_Nd, Sim_NC, Sim_Intern_NC, Sim_Tree&gt;::node() const’
../src/node_container/base_nc.h:120: error:   overriding ‘Sim_Nd *
    NC_with_1_abstract_Nd&lt;Sim_Nd, Sim_NC, Sim_Intern_NC, Sim_Tree&gt;::node()
    const’
</code></pre>
<p>Hierbei sehen meine Template-Klassen so aus</p>
<pre><code class="language-cpp">template&lt;class N, class C, class PC, class T&gt; class NC_with_1_abstract_Nd : public virtual Base_NC&lt;N, C, PC, T&gt;
{
public:
	virtual N* node() const = 0;
	…
};

template&lt;class N, class ON, class C, class PC, class T&gt; class NC_with_1_Nd
: public virtual NC_with_1_abstract_Nd&lt;N, C, PC, T&gt;, public virtual NC_with_Nds&lt;N, ON, C, PC, T&gt;
{
private:
	ON* m_node;
public:
	ON* node() const { return m_node; }
	…
}
</code></pre>
<p>Des Weiteren ist Sim_Tip_Nd aus Sim_Nd abgeleitet.</p>
<p>Weiss jemand, was hier los ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984528</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Tue, 23 Nov 2010 10:20:49 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Tue, 23 Nov 2010 11:19:27 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Klar darf man Methodenvorlagen spezialisieren. Das Problem in diesem Fall ist, dass die Signatur nicht übereinstimmt.</p>
<pre><code class="language-cpp">template&lt;&gt; int A::f&lt;int&gt;() /* --&gt; */ const /* &lt;-- */ { return 0; }
</code></pre>
</blockquote>
<p>Ich glaube nicht... hab den Auszug aus dem Standard grad nicht parat, aber ich hab´s auch schon mehrmals (Stichwort: Esel, Stein, stossen) probiert <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="😉"
    /><br />
Folgender Code kompiliert z.B. nicht:</p>
<pre><code class="language-cpp">#include &lt;string&gt;

using namespace std;

struct Test
{
	template&lt;typename T&gt;
	int func( const T&amp; op )
	{
		return 0;
	}

	template&lt;&gt;
	int func&lt;std::string&gt;( const std::string&amp; op )
	{
		return 1;
	}
};

int main()
{
   string s = &quot;Hello World&quot;;

   Test t;
   int r0 = t.func( 0 );
   int r1 = t.func( s );
}
</code></pre>
<p>Compiler Ausgabe:</p>
<pre><code>Comeau C/C++ 4.3.10.1 (Oct  6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing.  All rights reserved.
MODE:strict errors C++ C++0x_extensions

&quot;ComeauTest.c&quot;, line 13: error: explicit specialization is not allowed in the
          current scope
  	template&lt;&gt;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1984558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984558</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 23 Nov 2010 11:19:27 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Tue, 23 Nov 2010 13:10:27 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16288">@ingobulla</a>:<br />
Versuch ein vollständiges, compilierbares Minimalbeispiel zu bauen wo der Fehler auftritt (OK, in dem Fall *nicht* compilierbar, aber es sollte bis auf den einen Fehler compilieren).</p>
<p>BTW: ich schätze dass Sim_Tip_Nd eben doch nicht (public) von Sim_Nd abgeleitet ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984610</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 23 Nov 2010 13:10:27 GMT</pubDate></item><item><title><![CDATA[Reply to Template member function spezialisieren on Wed, 24 Nov 2010 14:29:00 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16288">@ingobulla</a>:<br />
Versuch ein vollständiges, compilierbares Minimalbeispiel zu bauen wo der Fehler auftritt (OK, in dem Fall *nicht* compilierbar, aber es sollte bis auf den einen Fehler compilieren).</p>
<p>BTW: ich schätze dass Sim_Tip_Nd eben doch nicht (public) von Sim_Nd abgeleitet ist.</p>
</blockquote>
<p>Ich habe den Fehler gefunden: Es fehlte ein passender Include, so dass dort, wo es nötig gewesen wäre, nicht bekannt war, dass Sim_Tip_Nd aus Sim_Nd abgeleitet ist.</p>
<p>Ich hätte noch eine Anschlussfrage, die werde ich aber aus Lesbarkeitsgründen als neuen Beitrag formulieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985174</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Wed, 24 Nov 2010 14:29:00 GMT</pubDate></item></channel></rss>