<?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[operator == nicht gefunden]]></title><description><![CDATA[<p>Hallo,<br />
was muss ich tun, damit bei folgendem Code der operator == gefunden wird? Warum wird er nicht gefunden?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename T&gt;
class BinaryTree
{
public:
  class ConstIterator
  {
  public:
    ConstIterator(BinaryTree const&amp; tree);

  private:
    template&lt;typename&gt;
    friend bool operator == (ConstIterator const&amp;, ConstIterator const&amp;);

    BinaryTree const* tree_;
  };

  ConstIterator Iterator() const;
};

template&lt;typename T&gt;
BinaryTree&lt;T&gt;::ConstIterator::ConstIterator(BinaryTree const&amp; tree)
  : tree_(&amp;tree)
{
}

template&lt;typename T&gt;
typename BinaryTree&lt;T&gt;::ConstIterator BinaryTree&lt;T&gt;::Iterator() const
{
  return ConstIterator(*this);
}

template&lt;typename T&gt;
bool operator == (typename BinaryTree&lt;T&gt;::ConstIterator const&amp; lhs, typename BinaryTree&lt;T&gt;::ConstIterator const&amp; rhs)
{
  return lhs.tree_ == rhs.tree_;
}

int main()
{
  typedef BinaryTree&lt;int&gt; Tree;

  Tree tree;
  std::cout &lt;&lt; (tree.Iterator() == tree.Iterator()) &lt;&lt; std::endl;

  return 0;
}
</code></pre>
<p>Meldung:</p>
<p>gcc-4.5.4 schrieb:</p>
<blockquote>
<p>test.cpp: In function ‘int main()’:<br />
test.cpp:46:50: error: no match for ‘operator==’ in ‘tree.BinaryTree&lt;T&gt;::Iterator [with T = int]() == tree.BinaryTree&lt;T&gt;::Iterator [with T = int]()’</p>
</blockquote>
<p>Danke!</p>
<p>MfG<br />
unwissender</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/309048/operator-nicht-gefunden</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 12:09:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/309048.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 Oct 2012 16:51:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator == nicht gefunden on Fri, 12 Oct 2012 16:51:21 GMT]]></title><description><![CDATA[<p>Hallo,<br />
was muss ich tun, damit bei folgendem Code der operator == gefunden wird? Warum wird er nicht gefunden?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename T&gt;
class BinaryTree
{
public:
  class ConstIterator
  {
  public:
    ConstIterator(BinaryTree const&amp; tree);

  private:
    template&lt;typename&gt;
    friend bool operator == (ConstIterator const&amp;, ConstIterator const&amp;);

    BinaryTree const* tree_;
  };

  ConstIterator Iterator() const;
};

template&lt;typename T&gt;
BinaryTree&lt;T&gt;::ConstIterator::ConstIterator(BinaryTree const&amp; tree)
  : tree_(&amp;tree)
{
}

template&lt;typename T&gt;
typename BinaryTree&lt;T&gt;::ConstIterator BinaryTree&lt;T&gt;::Iterator() const
{
  return ConstIterator(*this);
}

template&lt;typename T&gt;
bool operator == (typename BinaryTree&lt;T&gt;::ConstIterator const&amp; lhs, typename BinaryTree&lt;T&gt;::ConstIterator const&amp; rhs)
{
  return lhs.tree_ == rhs.tree_;
}

int main()
{
  typedef BinaryTree&lt;int&gt; Tree;

  Tree tree;
  std::cout &lt;&lt; (tree.Iterator() == tree.Iterator()) &lt;&lt; std::endl;

  return 0;
}
</code></pre>
<p>Meldung:</p>
<p>gcc-4.5.4 schrieb:</p>
<blockquote>
<p>test.cpp: In function ‘int main()’:<br />
test.cpp:46:50: error: no match for ‘operator==’ in ‘tree.BinaryTree&lt;T&gt;::Iterator [with T = int]() == tree.BinaryTree&lt;T&gt;::Iterator [with T = int]()’</p>
</blockquote>
<p>Danke!</p>
<p>MfG<br />
unwissender</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259749</guid><dc:creator><![CDATA[unwissender_]]></dc:creator><pubDate>Fri, 12 Oct 2012 16:51:21 GMT</pubDate></item><item><title><![CDATA[Reply to operator == nicht gefunden on Fri, 12 Oct 2012 17:06:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;typename T&gt;
class BinaryTree
{
...
  class ConstIterator
  {
...
    template&lt;typename&gt;
    friend bool operator == (ConstIterator const&amp;, ConstIterator const&amp;); // der Templateparameter ist überflüssig und ein Problem: er kann nicht deduziert werden
...
template&lt;typename T&gt; // Templateparameter kann nicht deduziert werden 
bool operator == (typename BinaryTree&lt;T&gt;::ConstIterator const&amp; lhs, typename BinaryTree&lt;T&gt;::ConstIterator const&amp; rhs);
</code></pre>
<p>Die einfachste Lösung besteht in eine inline-friend-Definition einer normalen Funktion</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class BinaryTree
{
...
  class ConstIterator
  {
...
    friend bool operator == (ConstIterator const&amp;, ConstIterator const&amp;)
    {
     ...
    }
</code></pre>
<p>Andere Möglichkeiten (die einen deduzierbaren Templateparameter zur Folge haben) wären:<br />
- den Vergleichsoperator T allgemeiner fassen und per Predikat und SFINAE auf ConstIterator einzuschränken<br />
- ConstIterator nicht als Member von BinaryTree zu definieren</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259754</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 12 Oct 2012 17:06:12 GMT</pubDate></item><item><title><![CDATA[Reply to operator == nicht gefunden on Fri, 12 Oct 2012 17:15:08 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort.</p>
<p>camper schrieb:</p>
<blockquote>
<p>Andere Möglichkeiten (die einen deduzierbaren Templateparameter zur Folge haben) wären:<br />
- den Vergleichsoperator T allgemeiner fassen und per Predikat und SFINAE auf ConstIterator einzuschränken</p>
</blockquote>
<p>Kannst du ein kleines Beispiel dazu geben? Also T allgemeiner fassen ist klar, aber wie genau stellst du dir das mit dem Predikat vor?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259756</guid><dc:creator><![CDATA[unwissender_]]></dc:creator><pubDate>Fri, 12 Oct 2012 17:15:08 GMT</pubDate></item><item><title><![CDATA[Reply to operator == nicht gefunden on Fri, 12 Oct 2012 18:53:21 GMT]]></title><description><![CDATA[<p>unwissender_ schrieb:</p>
<blockquote>
<p>Danke für deine Antwort.</p>
<p>camper schrieb:</p>
<blockquote>
<p>Andere Möglichkeiten (die einen deduzierbaren Templateparameter zur Folge haben) wären:<br />
- den Vergleichsoperator T allgemeiner fassen und per Predikat und SFINAE auf ConstIterator einzuschränken</p>
</blockquote>
<p>Kannst du ein kleines Beispiel dazu geben? Also T allgemeiner fassen ist klar, aber wie genau stellst du dir das mit dem Predikat vor?</p>
<p>Danke!</p>
</blockquote>
<p>z.B.</p>
<pre><code class="language-cpp">#include &lt;type_traits&gt;
#include &lt;utility&gt;

template&lt;typename T&gt;
class BinaryTree
{
public:
  class ConstIterator
  {
  public:
    typedef T value_type;
    ConstIterator(BinaryTree const&amp; tree);

  private:
    template&lt;typename U&gt;
    friend typename std::enable_if&lt;std::is_same&lt;U, typename Binary_Tree&lt;typename U::value_type&gt;::ConstIterator&gt;::value, bool&gt;::type operator == (const U&amp; lhs, const U&amp; rhs);

    BinaryTree const* tree_;
  };

  ConstIterator Iterator() const;
};

template&lt;typename U&gt;
typename std::enable_if&lt;std::is_same&lt;U, typename Binary_Tree&lt;typename U::value_type&gt;::ConstIterator&gt;::value, bool&gt;::type operator == (const U&amp; lhs, const U&amp; rhs)
{
  return lhs.tree_ == rhs.tree_;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2259783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259783</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 12 Oct 2012 18:53:21 GMT</pubDate></item><item><title><![CDATA[Reply to operator == nicht gefunden on Fri, 12 Oct 2012 20:58:29 GMT]]></title><description><![CDATA[<p>Eine andere Möglichkeit ist die Verallgemeinerung der Parameter verbunden mit einer eingeschränkten Sichtbarkeit (per ADL), z.B.</p>
<pre><code class="language-cpp">namespace secret
{
    struct secret_base {};

    template &lt;typename T&gt;
    bool operator==(const T&amp; lhs, const T&amp; rhs)
    {
        return lhs.tree_ == rhs.tree_;
    }
}

template&lt;typename T&gt;
class BinaryTree
{
public:
  class ConstIterator : secret::secret_base // secret ist damit assozierter Namensraum
  {
  public:
    ConstIterator(BinaryTree const&amp; tree);

  private:
    friend bool secret::operator==&lt;&gt;(const ConstIterator&amp; lhs, const ConstIterator&amp; rhs);

    BinaryTree const* tree_;
  };

  ConstIterator Iterator() const;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2259824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259824</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 12 Oct 2012 20:58:29 GMT</pubDate></item><item><title><![CDATA[Reply to operator == nicht gefunden on Sun, 14 Oct 2012 18:44:52 GMT]]></title><description><![CDATA[<p>Interessant. Danke fuer die Ausfuehrungen! Aber bei der Auswahl belasse ich den operator == einfach als Member-Funktion, sieht zwar ein bisschen komisch aus, ist aber imo noch besser als die Alternativen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2260398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2260398</guid><dc:creator><![CDATA[unwissender_]]></dc:creator><pubDate>Sun, 14 Oct 2012 18:44:52 GMT</pubDate></item></channel></rss>