<?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[Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe in einer Klasse <strong>Matrix</strong> folgende Konstruktion:</p>
<pre><code class="language-cpp">//Header-File
double&amp; operator () (unsigned row, unsigned col);
double operator () (unsigned row, unsigned col) const;

//Quellcode (Rumpf spielt keine Rolle)
inline double&amp; Matrix::operator () (unsigned row, unsigned col)
{
}

inline double Matrix::operator () (unsigned row, unsigned col) const
{
}
</code></pre>
<p>Nun habe ich eine Klasse <strong>Vector</strong> geschrieben, die den gleichen Operator auf ähnliche Art und Weise verwendet:</p>
<pre><code class="language-cpp">//Header
double&amp; operator () (unsigned);
double operator () (unsigned) const;

//Code (Rumpf spielt keine Rolle)
inline double&amp; Vector::operator () (unsigned row)
{
}

inline double Vector::operator () (unsigned row) const
{
}
</code></pre>
<p>Das lustige ist nun, dass diese KOnstruktion bei der Matrix funktioniert, aber nicht beim Vektor. Dort bekomme ich mit dem MS Visual Studio .NET 2003 folgenden Linker-Fehler:</p>
<blockquote>
<p>Demo error LNK2019: Nicht aufgelöstes externes Symbol '&quot;public: double &amp; __thiscall Vector::operator()(unsigned int)&quot; (??RVector@@QAEAANI@Z)', verwiesen in Funktion '_main'</p>
</blockquote>
<p>Dabei steht doch genau das gewünschte im Header-File (ja, im public-Teil). Und identische Konstruktion funktioniert bei der anderen Klasse!<br />
Das ganze geht auch nicht, wenn der Operator wie bei der Matrix 2 Parameter bekommt.</p>
<p>Hat da einer eine Idee und kann mir helfen?<br />
Danke im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/126097/überladener-operator-mag-nicht-obwohl-in-anderer-klasse-möglich</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 13:47:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/126097.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 11 Nov 2005 17:28:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Fri, 11 Nov 2005 17:28:45 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe in einer Klasse <strong>Matrix</strong> folgende Konstruktion:</p>
<pre><code class="language-cpp">//Header-File
double&amp; operator () (unsigned row, unsigned col);
double operator () (unsigned row, unsigned col) const;

//Quellcode (Rumpf spielt keine Rolle)
inline double&amp; Matrix::operator () (unsigned row, unsigned col)
{
}

inline double Matrix::operator () (unsigned row, unsigned col) const
{
}
</code></pre>
<p>Nun habe ich eine Klasse <strong>Vector</strong> geschrieben, die den gleichen Operator auf ähnliche Art und Weise verwendet:</p>
<pre><code class="language-cpp">//Header
double&amp; operator () (unsigned);
double operator () (unsigned) const;

//Code (Rumpf spielt keine Rolle)
inline double&amp; Vector::operator () (unsigned row)
{
}

inline double Vector::operator () (unsigned row) const
{
}
</code></pre>
<p>Das lustige ist nun, dass diese KOnstruktion bei der Matrix funktioniert, aber nicht beim Vektor. Dort bekomme ich mit dem MS Visual Studio .NET 2003 folgenden Linker-Fehler:</p>
<blockquote>
<p>Demo error LNK2019: Nicht aufgelöstes externes Symbol '&quot;public: double &amp; __thiscall Vector::operator()(unsigned int)&quot; (??RVector@@QAEAANI@Z)', verwiesen in Funktion '_main'</p>
</blockquote>
<p>Dabei steht doch genau das gewünschte im Header-File (ja, im public-Teil). Und identische Konstruktion funktioniert bei der anderen Klasse!<br />
Das ganze geht auch nicht, wenn der Operator wie bei der Matrix 2 Parameter bekommt.</p>
<p>Hat da einer eine Idee und kann mir helfen?<br />
Danke im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915371</guid><dc:creator><![CDATA[Chewie83]]></dc:creator><pubDate>Fri, 11 Nov 2005 17:28:45 GMT</pubDate></item><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Fri, 11 Nov 2005 17:33:37 GMT]]></title><description><![CDATA[<p>Öööhm, wie es oft so ist, kommt der Geistesblitz erst dann, wenn man in einem Forum gepostet hat.<br />
Ich habe nun das inline weggemacht (was wohlgemerkt bei der Matrix-Klasse funktioniert) und der Fehler taucht jetzt nicht mehr.</p>
<p>Wie es dazu kommt, ist mir allerdings völlig schleierhaft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915373</guid><dc:creator><![CDATA[Chewie83]]></dc:creator><pubDate>Fri, 11 Nov 2005 17:33:37 GMT</pubDate></item><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Fri, 11 Nov 2005 17:34:37 GMT]]></title><description><![CDATA[<p>--</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915374</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 11 Nov 2005 17:34:37 GMT</pubDate></item><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Fri, 11 Nov 2005 17:44:59 GMT]]></title><description><![CDATA[<p>Das inline zwingt dich dazu, die Methode so zu implementieren, dass sie potenziell geinlinet werden kann. Also musst du sie im Header definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915380</guid><dc:creator><![CDATA[Hm]]></dc:creator><pubDate>Fri, 11 Nov 2005 17:44:59 GMT</pubDate></item><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Fri, 11 Nov 2005 18:20:10 GMT]]></title><description><![CDATA[<p>Hm schrieb:</p>
<blockquote>
<p>Das inline zwingt dich dazu, die Methode so zu implementieren, dass sie potenziell geinlinet werden kann. Also musst du sie im Header definieren.</p>
</blockquote>
<p>Habe ich denn das nicht hiermit gemacht:</p>
<pre><code class="language-cpp">double&amp; operator () (unsigned);
double operator () (unsigned) const;
</code></pre>
<p>???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915401</guid><dc:creator><![CDATA[Chewie83]]></dc:creator><pubDate>Fri, 11 Nov 2005 18:20:10 GMT</pubDate></item><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Fri, 11 Nov 2005 18:36:10 GMT]]></title><description><![CDATA[<p>Das nennt man Deklaration.<br />
Wenn du eine Methode inline bezeichnest, musst du dafür sorgen, dass sie im Header auch definiert ist, sonst kann sie nicht geinlinet werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915412</guid><dc:creator><![CDATA[Hm]]></dc:creator><pubDate>Fri, 11 Nov 2005 18:36:10 GMT</pubDate></item><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Fri, 11 Nov 2005 19:28:01 GMT]]></title><description><![CDATA[<p>Hm schrieb:</p>
<blockquote>
<p>Das nennt man Deklaration.<br />
Wenn du eine Methode inline bezeichnest, musst du dafür sorgen, dass sie im Header auch definiert ist, sonst kann sie nicht geinlinet werden.</p>
</blockquote>
<p>Mir ist schon klar, was Deklaration und Definition ist <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 />
Aber es scheint, ich hatte dich falsch verstanden. Du meinst also, ich solle die Funktionsdefinition in den Header aufnehmen?<br />
Funktionieren tut das immerhin <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="😉"
    /></p>
<p>Aber wieso funktioniert das Inlinen dann bei der Matrix (mit abgesehen vom Klassennamen identischen Deklarationen), wenn ich die Funktion in der cpp-Datei definiere?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915454</guid><dc:creator><![CDATA[Chewie83]]></dc:creator><pubDate>Fri, 11 Nov 2005 19:28:01 GMT</pubDate></item><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Fri, 11 Nov 2005 19:46:25 GMT]]></title><description><![CDATA[<p>Chewie83 schrieb:</p>
<blockquote>
<p>Aber wieso funktioniert das Inlinen dann bei der Matrix (mit abgesehen vom Klassennamen identischen Deklarationen), wenn ich die Funktion in der cpp-Datei definiere?</p>
</blockquote>
<p>Rufst du den Operator irgendwo auf? Dem Compiler reicht die Deklaration, der Linker beschwert sich über fehlende Definitionen erst wenn sie benötigt werden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915467</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Fri, 11 Nov 2005 19:46:25 GMT</pubDate></item><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Fri, 11 Nov 2005 20:26:44 GMT]]></title><description><![CDATA[<p>Ja, ich ruf das ganze auf.<br />
Hm, könnte es vielleicht sein, dass der Compiler im ersten Fall entscheidet, dass die Methode <strong>nicht</strong> geinlinet wird. Der Linker kommt nun erst nach dieser &quot;Optimierung&quot; und für ihn ist es so, als wäre die Methode nicht inline.</p>
<p>Wie auch immer, wenn ich mal viel Zeit habe, muss ich mal eingehend mit den ganzen Mechanismen in C++ beschäftigen. Mein persönlicher Respekt an die, die die Eigenheiten dieser Sprache verstehen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915523</guid><dc:creator><![CDATA[Chewie83]]></dc:creator><pubDate>Fri, 11 Nov 2005 20:26:44 GMT</pubDate></item><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Fri, 11 Nov 2005 21:21:17 GMT]]></title><description><![CDATA[<p>mit dem inline darf das nichts zu tun haben und im header muss sie auch nicht definiert sein. member funktionen haben immer external linkage, und die definition muss der compiler nur dann sehen, wenn er vorher eine inline <em>deklaration</em> gesehen hat. das ist hier aber nicht der fall, die einzige deklaration ist die in der klassendefinition und die enthält kein inline. der fehler kann nicht im geposteten code allain liegen.</p>
<p>nebenbei - wieso wird in einem const overload eigentlich aus T&amp; immer T statt const T&amp; ? das ist unintuitiv und hat einige merkwürdige konsequenzen (z.b. mit dem &amp; operator - der geht nicht bei built-in rvalues, und bei anderen typen ist der zeiger unbrauchbar; hat man den non-const overload erwischt, klappt alles).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915564</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 11 Nov 2005 21:21:17 GMT</pubDate></item><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Sat, 12 Nov 2005 07:22:20 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>nebenbei - wieso wird in einem const overload eigentlich aus T&amp; immer T statt const T&amp; ?</p>
</blockquote>
<p>Vielleicht hat der OP ja Angst vor const_cast. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Ich verwender aber auch eher 'const T&amp;'.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915659</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sat, 12 Nov 2005 07:22:20 GMT</pubDate></item><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Sat, 12 Nov 2005 08:28:38 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>nebenbei - wieso wird in einem const overload eigentlich aus T&amp; immer T statt const T&amp; ? das ist unintuitiv und hat einige merkwürdige konsequenzen (z.b. mit dem &amp; operator - der geht nicht bei built-in rvalues, und bei anderen typen ist der zeiger unbrauchbar; hat man den non-const overload erwischt, klappt alles).</p>
</blockquote>
<p>Meinst du das:</p>
<pre><code class="language-cpp">double&amp; operator () (unsigned);
double operator () (unsigned) const;
</code></pre>
<p>Das hab ich von <a href="http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.10" rel="nofollow">http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.10</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/915684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915684</guid><dc:creator><![CDATA[Chewie83]]></dc:creator><pubDate>Sat, 12 Nov 2005 08:28:38 GMT</pubDate></item><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Sat, 12 Nov 2005 09:29:23 GMT]]></title><description><![CDATA[<p>Es ging weniger um den () Operator, sondern um den Rückgabewert. Die const Version kannst du auch wie folgt schreiben:</p>
<pre><code class="language-cpp">const double&amp; operator () (unsigned) const;
</code></pre>
<p>Gerade wenn du nicht-triviale Rückgabewerte hast, kann das ein Vorteil sein, weil der Compiler hier besser optimieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915704</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sat, 12 Nov 2005 09:29:23 GMT</pubDate></item><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Sat, 12 Nov 2005 09:31:12 GMT]]></title><description><![CDATA[<p>Danke, dann werd ich das mal probieren.<br />
Welche Auswirkung hat das dann auf die Semantik?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915706</guid><dc:creator><![CDATA[Chewie83]]></dc:creator><pubDate>Sat, 12 Nov 2005 09:31:12 GMT</pubDate></item><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Sat, 12 Nov 2005 09:44:47 GMT]]></title><description><![CDATA[<p>Für den Nutzer gar keine, aber er spart sich damit einen Aufruf des Copy-Ctors und Dtors</p>
<p>&quot;double operator() const&quot; kopiert den Wert aus deinem Vektor in eine temporäre Variable, die dann der Zielvariablen zugewiesen wird, und löscht hinterher die temporäre Variable. &quot;const double&amp; operator() const&quot; weist <em>direkt</em> aus dem Vektor der Zielvariablen zu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915716</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 12 Nov 2005 09:44:47 GMT</pubDate></item><item><title><![CDATA[Reply to Überladener ()-Operator mag nicht, obwohl in anderer Klasse möglich on Sat, 12 Nov 2005 09:49:34 GMT]]></title><description><![CDATA[<p>ein referenz ist ein lvalue, gibts du irgendetwas anderes zurück ist es ein rvalue. der unterschied bei builtins ist hinsichtlich dessen, was du tun kannst, nicht besonders gross. allerdings, gerade bei einer matrix-klasse, die mir verspricht, dass ihre daten intern in einem array gespeichert werden, kann es nützlich sein den adress-operator zu benutzen um iteratoren für standardalgorithmen zu bekommen, falls die klasse selbst keine iteratoren zur verfügung stellt. den adress-operator kannst du aber nur auf lvalues anwenden - und für fundamentale typen gibt es keine möglichkeit aus einem rvalue wieder ein lvalue zu machen.</p>
<p>bei klassen sieht das ganze etwas anders aus. innerhalb einer klasse ist *this stets ein lvalue - du kannst aber memberfunktionen auch mit rvalues benutzen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/915719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915719</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 12 Nov 2005 09:49:34 GMT</pubDate></item></channel></rss>