<?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[Operatoren&#x2F;Overloading&#x2F;Templates]]></title><description><![CDATA[<p>Ich sitze hier gerade vor einem ziemlich eigenartigen Problem. Nehmen wir an ich habe folgenden Code:</p>
<pre><code class="language-cpp">template&lt;typename A&gt;
class Foo
{
public: //
        operator A();
};

template&lt;typename A,
         typename B&gt;
static A Bar(B Value);

template&lt;typename A,
         typename B&gt;
static A Bar(Foo&lt;B&gt; Value);
</code></pre>
<p>Wie man hier sieht, hat Foo&lt;A&gt; einen Operatoren zur impliziten Konvertierung nach A. Die Funktion Bar&lt;A, B&gt; soll im Fall, dass sie zusammen mit einem Object Foo&lt;B&gt; anstelle eines Objektes B aufgerufen wird, anderen Code ausführen. Das Problem besteht darin, dass der Compiler nicht weiss, welche Funktion er aufrufen will. Der Quelltext zur Klasse Foo&lt;A&gt; darf aber nicht geändert werden. Gibt es dafür eine Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/117660/operatoren-overloading-templates</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 02:49:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/117660.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Aug 2005 22:55:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operatoren&#x2F;Overloading&#x2F;Templates on Tue, 09 Aug 2005 22:55:10 GMT]]></title><description><![CDATA[<p>Ich sitze hier gerade vor einem ziemlich eigenartigen Problem. Nehmen wir an ich habe folgenden Code:</p>
<pre><code class="language-cpp">template&lt;typename A&gt;
class Foo
{
public: //
        operator A();
};

template&lt;typename A,
         typename B&gt;
static A Bar(B Value);

template&lt;typename A,
         typename B&gt;
static A Bar(Foo&lt;B&gt; Value);
</code></pre>
<p>Wie man hier sieht, hat Foo&lt;A&gt; einen Operatoren zur impliziten Konvertierung nach A. Die Funktion Bar&lt;A, B&gt; soll im Fall, dass sie zusammen mit einem Object Foo&lt;B&gt; anstelle eines Objektes B aufgerufen wird, anderen Code ausführen. Das Problem besteht darin, dass der Compiler nicht weiss, welche Funktion er aufrufen will. Der Quelltext zur Klasse Foo&lt;A&gt; darf aber nicht geändert werden. Gibt es dafür eine Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849042</guid><dc:creator><![CDATA[WTF_Wayne]]></dc:creator><pubDate>Tue, 09 Aug 2005 22:55:10 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren&#x2F;Overloading&#x2F;Templates on Wed, 10 Aug 2005 08:38:41 GMT]]></title><description><![CDATA[<p>Mir fällt eine recht hässliche Lösung ein:</p>
<p>Man erstelle sich eine simple zusätzliche Templateklasse:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class Funny
  {
  T my_intern;
  Funny&lt;T&gt;&amp; operator=(const Funny&lt;T&gt;&amp;);  //op== verbergen
  Funny&lt;T&gt;(const Funny&lt;T&gt;&amp;);             //copy-ctor verbergen

  public:
  explicit Funny(T&amp; arg) : my_intern(arg) {}; //macht aus einem T ein Funny&lt;T&gt;
  ~Funny() {};

  operator T() { return my_intern; } //macht aus dem funny wieder ein T
  }

template&lt;typename A,
         typename B&gt;
static A InnerBar(B Value);

template&lt;typename A,
         typename B&gt;
static A InnerBar(Foo&lt;B&gt; Value);

template&lt;typename A, typename B&gt;
static A Bar(Funny&lt;B&gt; Value) { return InnerBar(Value); }
</code></pre>
<p>Auzurufen ist jetzt nur Bar. Das besondere: wenn du Bar mit Foo&lt;X&gt; aufrufst, dann wird erst ein Funny&lt; Foo&lt;X&gt; &gt; erstellt, und zwar Implizit. Es wird auf jedenfall kein Funny&lt;X&gt; erstellt, weil der Compiler nicht zwei implizite Typumwandlungen auf einmal macht, und das müsste er:<br />
Foo&lt;X&gt; --&gt; X --&gt; Funny&lt;X&gt;</p>
<p>Wenn dann InnerBar aufgerufen wird, wird aus dem Funny ein Foo gemacht, aber nicht Funny -&gt; Foo -&gt; B, weils wieder zwei konvertierungen wären.</p>
<p>Bin allerdings nicht ganz sicher ob das tut...</p>
<p>Edit: alles blödsinn..<br />
Nein, dein Problem kann man nicht lösen, weil das B aus dem ersten Template ja genausogut ein Foo&lt;X&gt; sein könnte. stell dir mal vor, was passieren soll, wenn jemand Bar(Foo&lt; Foo&lt; Foo&lt;X&gt; &gt; &gt;) aufruft... dann ist eben B = Foo&lt; Foo&lt; Foo&lt;X&gt; &gt; &gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849146</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 10 Aug 2005 08:38:41 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren&#x2F;Overloading&#x2F;Templates on Wed, 10 Aug 2005 09:09:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;typename A,
         typename B&gt;
static A Bar(Foo&lt;B&gt; Value);
</code></pre>
<p>wenn ich das richtig sehe, kann die funktion ohnehin nur qualifiert aufgerufen werden, denn A kann der compiler nicht aus dem aufruf herleiten. eine spezialisierung für Foo&lt;B&gt; fällt ebenfalls aus, denn partielle spezialisierungen sind für funktionen nicht möglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849165</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 10 Aug 2005 09:09:12 GMT</pubDate></item></channel></rss>