<?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[Überladen&#x2F;Spezialisieren von Template-Funktionen]]></title><description><![CDATA[<p>Moin Leute!</p>
<p>Ich habe in einer Template-Klasse die Funktionen</p>
<pre><code class="language-cpp">BOOL Equals (T a, T b)
BOOL Equals (std::string a, std::string b)
</code></pre>
<p>Beim Kompilieren tritt die folgende Fehlermeldung auf:</p>
<pre><code>error C2535: 'BOOL MyClass&lt;T&gt;::Equals(T,T)' : member function already defined or declared
</code></pre>
<p>Warum der Fehler auftritt kann ich zumindest nachvollziehen (T kann ja auch vom Typ std::string sein), aber wie muss ich die Funktion überladen, damit bei Variablen vom Typ std::string die zweite Funktion aufgerufen wird?</p>
<p>Ich hab's auch mit einer Spezialisierung versucht:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; BOOL Equals (T a, T b) 
template &lt;class T&gt; BOOL Equals (std::string a, std::string b)
</code></pre>
<p>Dann bekomme ich allerdings die folgende Fehlermeldung:</p>
<pre><code>error C2678: binary '==' : no operator found which takes a left-hand operand of type 'std::basic_string&lt;_Elem,_Traits,_Ax&gt;' (or there is no acceptable conversion)
</code></pre>
<p>Die Klassen, die den &quot;==&quot;-Operator nicht entsprechend implementiert haben anzupassen kommt leider nicht in Frage, daher brauche ich eine andere Lösung. Kann mir da jemand helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/269346/überladen-spezialisieren-von-template-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 06:57:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269346.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 Jun 2010 12:02:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Überladen&#x2F;Spezialisieren von Template-Funktionen on Wed, 23 Jun 2010 12:02:54 GMT]]></title><description><![CDATA[<p>Moin Leute!</p>
<p>Ich habe in einer Template-Klasse die Funktionen</p>
<pre><code class="language-cpp">BOOL Equals (T a, T b)
BOOL Equals (std::string a, std::string b)
</code></pre>
<p>Beim Kompilieren tritt die folgende Fehlermeldung auf:</p>
<pre><code>error C2535: 'BOOL MyClass&lt;T&gt;::Equals(T,T)' : member function already defined or declared
</code></pre>
<p>Warum der Fehler auftritt kann ich zumindest nachvollziehen (T kann ja auch vom Typ std::string sein), aber wie muss ich die Funktion überladen, damit bei Variablen vom Typ std::string die zweite Funktion aufgerufen wird?</p>
<p>Ich hab's auch mit einer Spezialisierung versucht:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; BOOL Equals (T a, T b) 
template &lt;class T&gt; BOOL Equals (std::string a, std::string b)
</code></pre>
<p>Dann bekomme ich allerdings die folgende Fehlermeldung:</p>
<pre><code>error C2678: binary '==' : no operator found which takes a left-hand operand of type 'std::basic_string&lt;_Elem,_Traits,_Ax&gt;' (or there is no acceptable conversion)
</code></pre>
<p>Die Klassen, die den &quot;==&quot;-Operator nicht entsprechend implementiert haben anzupassen kommt leider nicht in Frage, daher brauche ich eine andere Lösung. Kann mir da jemand helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1916253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916253</guid><dc:creator><![CDATA[Hellcat]]></dc:creator><pubDate>Wed, 23 Jun 2010 12:02:54 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen&#x2F;Spezialisieren von Template-Funktionen on Wed, 23 Jun 2010 12:13:58 GMT]]></title><description><![CDATA[<p>- in C++ haben wir den Typen <code>bool</code><br />
- Du zeigst zu wenig Code<br />
- Deine &quot;Spezialisierungen&quot; sehen nicht wie Spezialisierungen aus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1916262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916262</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 23 Jun 2010 12:13:58 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen&#x2F;Spezialisieren von Template-Funktionen on Wed, 23 Jun 2010 12:23:26 GMT]]></title><description><![CDATA[<p>Die Funktionen beinhalten nicht wirklich interessanten Code, aber ich kann ihn der Vollständigkeit halber ja noch mal posten.</p>
<pre><code class="language-cpp">// Template-Fuktion zum Vergleichen von Werten
	template &lt;typename T&gt; bool Equals (T a, T b) 
	{
		return a == b;
	}

	template &lt;typename T&gt; bool Equals (std::string a, std::string b) 
	{
		bool result = false;
		if (a.compare(b) == 0) 
		{
			result = true;
		}
		return result;
	}
</code></pre>
<p>Wie müsste die richtige Spezialisierung denn dann aussehen? Ungefähr so?</p>
<pre><code class="language-cpp">// Template-Fuktion zum Vergleichen von Werten
	template &lt;typename T&gt; bool Equals (T a, T b) 
	{
		return a == b;
	}

	template &lt;std::string&gt; bool Equals (std::string a, std::string b) 
	{
		bool result = false;
		if (a.compare(b) == 0) 
		{
			result = true;
		}
		return result;
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1916269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916269</guid><dc:creator><![CDATA[Hellcat]]></dc:creator><pubDate>Wed, 23 Jun 2010 12:23:26 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen&#x2F;Spezialisieren von Template-Funktionen on Wed, 23 Jun 2010 12:28:37 GMT]]></title><description><![CDATA[<p>Ich habe zuerst an SFINAE gedacht, dann an Überladung, und schliesslich gemerkt, dass das alles unnötig ist, weil <code>std::string</code> auch einen <code>operator==</code> unterstützt.</p>
<p>Davon abgesehen frage ich mich wirklich, warum viele Leute den maximal komplizierten Weg wählen.</p>
<pre><code class="language-cpp">bool result = false; 
        if (a.compare(b) == 0) 
        { 
            result = true; 
        } 
        return result;
</code></pre>
<p>-&gt;</p>
<pre><code class="language-cpp">return a.compare(b) == 0;
</code></pre>
<p>Aber wie gesagt: Hier reicht eine Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1916273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916273</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 23 Jun 2010 12:28:37 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen&#x2F;Spezialisieren von Template-Funktionen on Wed, 23 Jun 2010 12:34:54 GMT]]></title><description><![CDATA[<p>Templatefunktionen sollte man nicht spezialisieren: <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/1916282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916282</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 23 Jun 2010 12:34:54 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen&#x2F;Spezialisieren von Template-Funktionen on Wed, 23 Jun 2010 12:49:05 GMT]]></title><description><![CDATA[<p>Ganz davon abgesehen:</p>
<p>1. Hat es sein Grund das nicht der Typ bool für die Rückgabe verwendet wird (Was ist BOOL?).<br />
2. Wäre es nicht sinnvoller (auch wenn dies bei den Basisdatentypen vielleicht einen kleinen Overhead erzeugt) statt &quot;By Value&quot; lieber auf konstante Referenzen umzustellen, oder sollen wirklich immer Kopien zum vergleichen erzeugt werden?</p>
<pre><code class="language-cpp">bool Equals (T const &amp; a, T const &amp; b);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1916293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916293</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 23 Jun 2010 12:49:05 GMT</pubDate></item></channel></rss>