<?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[STL basisklassen]]></title><description><![CDATA[<p>Hallo miteinander,</p>
<p>ich hab gerade einen Hänger bezüglich der STL-Basisklassen wie z. B. unary_function oder binary_function. Im Buch &quot;The C++ Programming Language&quot; und in der MSDN wird empfohlen functoren (function objects) von solchen Basisklassen abzuleiten um die dort festgelegten, einheitlichen Begriffe zu verwenden.</p>
<p>So weit, so einleuchtend. Jetzt bin ich aber über die Definitionen einiger STL-Funktionen gestolpert. Z. B. ist logical_not aus dem &lt;functional&gt;-Header dort folgender maßen definiert:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
struct logical_not
    : public unary_function&lt;T, bool&gt;
{
    bool operator ()(const T&amp; x) const
    {
        return !x;
    }
};
</code></pre>
<p>Unterläuft diese Definition nicht den Grundgedanken der Basisklassen, und müsste obige Definition nicht richtiger wie folgt lauten?</p>
<pre><code class="language-cpp">template&lt;class T&gt;
struct logical_not
    : public unary_function&lt;T, bool&gt;
{
    result_type operator ()(const argument_type&amp; x) const
    {
        return !x;
    }
};
</code></pre>
<p>Wo liegt sonst der Vorteil der Basisklassen. Was habe ich evtl. übersehen?</p>
<p>Bin für jeden Hinweis Dankbar.<br />
Viele Grüße<br />
Knecht</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/167688/stl-basisklassen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 05:53:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/167688.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 13 Dec 2006 20:12:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to STL basisklassen on Wed, 13 Dec 2006 20:12:22 GMT]]></title><description><![CDATA[<p>Hallo miteinander,</p>
<p>ich hab gerade einen Hänger bezüglich der STL-Basisklassen wie z. B. unary_function oder binary_function. Im Buch &quot;The C++ Programming Language&quot; und in der MSDN wird empfohlen functoren (function objects) von solchen Basisklassen abzuleiten um die dort festgelegten, einheitlichen Begriffe zu verwenden.</p>
<p>So weit, so einleuchtend. Jetzt bin ich aber über die Definitionen einiger STL-Funktionen gestolpert. Z. B. ist logical_not aus dem &lt;functional&gt;-Header dort folgender maßen definiert:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
struct logical_not
    : public unary_function&lt;T, bool&gt;
{
    bool operator ()(const T&amp; x) const
    {
        return !x;
    }
};
</code></pre>
<p>Unterläuft diese Definition nicht den Grundgedanken der Basisklassen, und müsste obige Definition nicht richtiger wie folgt lauten?</p>
<pre><code class="language-cpp">template&lt;class T&gt;
struct logical_not
    : public unary_function&lt;T, bool&gt;
{
    result_type operator ()(const argument_type&amp; x) const
    {
        return !x;
    }
};
</code></pre>
<p>Wo liegt sonst der Vorteil der Basisklassen. Was habe ich evtl. übersehen?</p>
<p>Bin für jeden Hinweis Dankbar.<br />
Viele Grüße<br />
Knecht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191415</guid><dc:creator><![CDATA[Knecht]]></dc:creator><pubDate>Wed, 13 Dec 2006 20:12:22 GMT</pubDate></item><item><title><![CDATA[Reply to STL basisklassen on Wed, 13 Dec 2006 21:55:52 GMT]]></title><description><![CDATA[<p>Knecht schrieb:</p>
<blockquote>
<p>und müsste obige Definition nicht richtiger wie folgt lauten?</p>
</blockquote>
<p>Da hast Du im Prinzip recht -- aber versuch das mal zu kompilieren. Das klappt nicht, Du musst die Typen vollständig qualifizieren -- und das zerstört den Code noch viel effektiver:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
struct logical_not : public unary_function&lt;T, bool&gt;
{
    typename unary_function&lt;T, bool&gt;::result_type operator ()(const typename unary_function&lt;T, bool&gt;::argument_type&amp; x) const
    {
        return !x;
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1191453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191453</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Wed, 13 Dec 2006 21:55:52 GMT</pubDate></item><item><title><![CDATA[Reply to STL basisklassen on Wed, 13 Dec 2006 22:23:46 GMT]]></title><description><![CDATA[<p>Danke für die Antwort. Aber ich bin da noch nicht ganz dabei. Die Definition für unary_function sieht in meiner functional.h (Visual Studio 2005 Standard) so aus:</p>
<pre><code class="language-cpp">template&lt;class _Arg, class _Result&gt;
struct unary_function
{	// base class for unary functions
    typedef _Arg argument_type;
    typedef _Result result_type;
};
</code></pre>
<p>Das heißt doch dass die typedefs public sind, oder? Und da ich diese Basisklasse public vererbe müsste ich diese ohne vollständige qualifizierer verwenden können.</p>
<p>Mein VS compiliert obiges Beisiel jedenfalls anstandslos.</p>
<p>Nochmals Danke.<br />
Viele Grüße<br />
Knecht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191465</guid><dc:creator><![CDATA[Knecht]]></dc:creator><pubDate>Wed, 13 Dec 2006 22:23:46 GMT</pubDate></item><item><title><![CDATA[Reply to STL basisklassen on Wed, 13 Dec 2006 22:29:08 GMT]]></title><description><![CDATA[<p>Knecht schrieb:</p>
<blockquote>
<p>Mein VS compiliert obiges Beisiel jedenfalls anstandslos.</p>
</blockquote>
<p>Hmm, es ist möglich, dass der GCC da streikt. Ich habe leider gerade auch den Standard nicht zur Hand. Prinzipiell müsstest Du eigentlich recht haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191466</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Wed, 13 Dec 2006 22:29:08 GMT</pubDate></item><item><title><![CDATA[Reply to STL basisklassen on Wed, 13 Dec 2006 22:35:47 GMT]]></title><description><![CDATA[<p>Knecht schrieb:</p>
<blockquote>
<p>Unterläuft diese Definition nicht den Grundgedanken der Basisklassen, und müsste obige Definition nicht richtiger wie folgt lauten?</p>
</blockquote>
<p>nö. du weißt doch, daß da bool steht.<br />
das erben hat eher den zweck, daß jeder fremde dich nach den üblichen sachen fragen kann. sonst würde man meistens gar keinen result_type anbieten zum beispiel. besser ist, man machts gleich mit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191468</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 13 Dec 2006 22:35:47 GMT</pubDate></item><item><title><![CDATA[Reply to STL basisklassen on Wed, 13 Dec 2006 22:42:13 GMT]]></title><description><![CDATA[<p>Knecht schrieb:</p>
<blockquote>
<p>Das heißt doch dass die typedefs public sind, oder? Und da ich diese Basisklasse public vererbe müsste ich diese ohne vollständige qualifizierer verwenden können.</p>
</blockquote>
<p>Moooment. Dass die Typedefs public sind, bedeutet, dass du überhaupt auf sie zugreifen kannst. Du musst den Aufruf allerdings qualifizieren, weil dem Compiler bei der Schablonenerstellung keine konkrete Klasse als Basisklasse vorliegt und er somit nicht erkennen kann, dass es sich um einen Typ handelt, der dazu auch noch in der Basisklasse versteckt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191472</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 13 Dec 2006 22:42:13 GMT</pubDate></item><item><title><![CDATA[Reply to STL basisklassen on Wed, 13 Dec 2006 23:13:52 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>... das erben hat eher den zweck, daß jeder fremde dich nach den üblichen sachen fragen kann. sonst würde man meistens gar keinen result_type anbieten zum beispiel. besser ist, man machts gleich mit.</p>
</blockquote>
<p>Wenn ich das richtig verstanden habe heisst das also, dass die Vererbung nur für den Zugriff von &quot;außen&quot; benötigt wird, da die außenstehenden methoden ja u. U. nicht wissen welche Typen verwendet wurden. Das macht Sinn.</p>
<p>[Edit:] <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/5021">@Konrad</a> Rudolph &amp; Michael E.: Mit den Qualifizierungen hab Ihr schon recht. Hab beim Ausprobieren die unary_function-Struktur einer nicht-Vorlagenklasse vererbt. Dass es dort funktioniert ist Klar. Sorry dafür!!!</p>
<p>Herzlichen Dank für alle Antworten und einen schönen Abend. <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="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Viele Grüße<br />
Knecht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191475</guid><dc:creator><![CDATA[Knecht]]></dc:creator><pubDate>Wed, 13 Dec 2006 23:13:52 GMT</pubDate></item><item><title><![CDATA[Reply to STL basisklassen on Thu, 14 Dec 2006 09:00:00 GMT]]></title><description><![CDATA[<p>Hmmm,</p>
<p>ich hatte das so verstanden, dass die Ursache für das &quot;typedef wird nicht gefunden&quot;-Problem daran liegt, dass man nicht einfach von unary_function erbt, sondern damit ein template erstellt.<br />
Leitet man &quot;konkret&quot; ab</p>
<pre><code class="language-cpp">struct logical_not_int
    : public unary_function&lt;int, bool&gt;
{
    result_type operator ()(const int&amp; x) const
    {
        return !x;
    }
};
</code></pre>
<p>funktioniert's nämlich.</p>
<p>Ich bin kein template-Profi, aber nach meiner Erinnerung kümmert sich der Compiler &quot;erst spät um Vererbung&quot;. Will sagen: Unqualifizierte Namen in templates werden innerhalb des templates aufzulösen versucht - NICHT in Basisklassen; weil er (hier) erst das logical_not-template ganz &quot;verstanden haben&quot; muss, bevor er weiß, auf welche konkrete Basisklasse er zugreifen soll. Bei voll qualifizierten Namen, hat man dem Compiler bereits mitgeteilt, wo er suchen soll/kann.</p>
<p>Hat man aber kein template, sondern eine konkrete Klasse, fällt dieser Schritt weg.</p>
<p>Stimmt's so in etwa ? Habe ich vielleicht dasselbe gesagt/gemeint, wie alle anderen ? ...<br />
EDIT: Vielleicht wusste das der Knecht auch schon ... und ich habe sein Post erst jetzt verstanden ....</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191565</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 14 Dec 2006 09:00:00 GMT</pubDate></item><item><title><![CDATA[Reply to STL basisklassen on Fri, 15 Dec 2006 13:28:32 GMT]]></title><description><![CDATA[<p>Jo, stimmt im Groben.</p>
<p>Deutlich machen kann man sich das an diesem Beispiel:</p>
<pre><code class="language-cpp">template&lt;int&gt;
struct Base
{
    typedef int foo;
};

template&lt; &gt;
struct Base&lt;0&gt;
{
    void foo();
};

template&lt;int n&gt;
class Derived : Base&lt;n&gt;
{
    typedef typename Base&lt;n&gt;::foo;    // erzeugt Fehler für n = 0
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1192462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192462</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 15 Dec 2006 13:28:32 GMT</pubDate></item><item><title><![CDATA[Reply to STL basisklassen on Sat, 16 Dec 2006 00:54:13 GMT]]></title><description><![CDATA[<p>Danke,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192777</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sat, 16 Dec 2006 00:54:13 GMT</pubDate></item></channel></rss>