{"id":15,"date":"2008-12-08T23:55:52","date_gmt":"2008-12-08T21:55:52","guid":{"rendered":"http:\/\/blog.familie-heming.de\/?p=15"},"modified":"2014-09-04T07:01:32","modified_gmt":"2014-09-04T06:01:32","slug":"lustige-operatorensuche-in-c-koenig-lookup","status":"publish","type":"post","link":"https:\/\/blog.familie-heming.de\/?p=15","title":{"rendered":"Lustige Operatorensuche in C++ (Koenig Lookup?)"},"content":{"rendered":"<p>Bei der Korrektur von \u00dcbungsbl\u00e4ttern zu einer C++ Vorlesung bin ich auf das folgende, auf den ersten Blick sehr simple Ph\u00e4nomen gesto\u00dfen: Da definiert mir doch jemand eine friend Methode innerhalb der Klasse. Wohlgemerkt nicht nur eine Deklaration, sondern eine ganz Implementation. Ausschnittsweise sieht das nun wie folgt aus:<\/p>\n<p><code>class Koordinaten<br \/>\n{<br \/>\n...<br \/>\nfriend ostream&amp; operator&lt;&lt;( ostream&amp; os, const Koordinaten&amp; out );<br \/>\n{<br \/>\nos &lt;&lt; \"X-Koordinate: \" &lt;&lt; out.x &lt;&lt; endl ;<br \/>\nos &lt;&lt; \"Y-Koordinate: \" &lt;&lt; out.y &lt;&lt; endl ;<br \/>\nos &lt;&lt; \"Z-Koordinate: \" &lt;&lt; out.z &lt;&lt; endl ;<br \/>\nreturn os ;<br \/>\n}<br \/>\n};<\/code><\/p>\n<p>Naja, h\u00fcbsche Idee, das wird definitiv nicht kompilieren &#8212; dachte ich mir. Schief gewickelt. Klappt sogar sehr gut. Aber warum?<\/p>\n<p>Bisher dachte ich, nach friend darf gar keine Definition folgen. Gut, deklariert man eine Methode an mehreren Stelle (z.B. Aufteilung in hpp und cpp Dateien), dann k\u00f6nnte es doch eigentlich egal sein, an welcher Stelle die Implementierung steh. Aber ganz ohne Deklaration au\u00dferhalb der Klasse h\u00e4tte ich nicht vermutet, dass C++ diesen Operator \u00fcberhaupt findet.<\/p>\n<p>Naja, im Rahmen einiger Recherchen zu den verschiedensten C++-Ph\u00e4nomenen bin ich auf die Homepage von <a href=\"http:\/\/fara.cs.uni-potsdam.de\/~kaufmann\/\" title=\"Benjamin Kaufmann\">Benjamin Kaufmann<\/a> gesto\u00dfen. Er schildert in seiner C++ FAQ in kurzer und knapper Weise das Prinzip des <a href=\"http:\/\/fara.cs.uni-potsdam.de\/~kaufmann\/?page=GenCppFaqs&amp;faq=Koenig#Answ\" title=\"Koenig Lookup\">Koenig Lookup<\/a> und wenn ich mich nicht v\u00f6llig verdreht habe, dann k\u00f6nnte gerade dieses die L\u00f6sung zur Operatorensuche (bzw. zum Ph\u00e4nomen des Findens) sein. Betrachtet man n\u00e4mlich den zweiten Punkt<\/p>\n<p><code>ist T eine Instanz einer Klasse\/Struktur X, kommen alle Namensr\u00e4ume hinzu, in denen X definiert wird.<\/code><\/p>\n<p>dann interpretiere ich mal die Klasse als Namensraum, welcher automatisch durchsucht wird, da als Parameter des Operators ein Objekt dieser Klasse vorkommt.<\/p>\n<p>Neben der Tatsache, dass ich nat\u00fcrlich eine solche Definition nicht guthei\u00dfe, da sie ziemlich verwirrend ist, wollte ich meine Erkenntnisse einfach einmal mitteilen, denn bisher dachte ich, dass soetwas abgefahrenes \u00fcberhaupt nicht m\u00f6glich sei.<\/p>\n<p><strong>Zusatz:<\/strong><\/p>\n<p>Habe von Benjamin Kaufmann eine kleine Erkl\u00e4rung bekommen, die meine Gedanken zu der Problematik best\u00e4tigt. Es sei hier nur noch der Hinweis angebracht, dass das <em>Koenig Lookup<\/em> auch <em>argument dependent lookup <\/em>genannt wird und dazu sogar eine kleine Seite in der Wikipedia existiert (zumindest auf Englisch) <a href=\"http:\/\/en.wikipedia.org\/wiki\/Argument_dependent_lookup\" title=\"argument dependet lookup\">http:\/\/en.wikipedia.org\/wiki\/Argument_dependent_lookup<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bei der Korrektur von \u00dcbungsbl\u00e4ttern zu einer C++ Vorlesung bin ich auf das folgende, auf den ersten Blick sehr simple Ph\u00e4nomen gesto\u00dfen: Da definiert mir doch jemand eine friend Methode innerhalb der Klasse. Wohlgemerkt nicht nur eine Deklaration, sondern eine &hellip; <a href=\"https:\/\/blog.familie-heming.de\/?p=15\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.familie-heming.de\/index.php?rest_route=\/wp\/v2\/posts\/15"}],"collection":[{"href":"https:\/\/blog.familie-heming.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.familie-heming.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.familie-heming.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.familie-heming.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=15"}],"version-history":[{"count":1,"href":"https:\/\/blog.familie-heming.de\/index.php?rest_route=\/wp\/v2\/posts\/15\/revisions"}],"predecessor-version":[{"id":186,"href":"https:\/\/blog.familie-heming.de\/index.php?rest_route=\/wp\/v2\/posts\/15\/revisions\/186"}],"wp:attachment":[{"href":"https:\/\/blog.familie-heming.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=15"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.familie-heming.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=15"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.familie-heming.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=15"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}