<?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[Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator]]></title><description><![CDATA[<p>Die Frage kam durch Clang-Tidy, wo empfohlen wurde std::sort durch std::ranges::sort zu ersetzen. Mache ich dies, so bekomme ich vom VS Compiler die Fehlermeldung:</p>
<blockquote>
<p>Fehler	C2672	&quot;operator __surrogate_func&quot;: keine übereinstimmende überladene Funktion gefunden</p>
</blockquote>
<p>Verkürzt sieht der Code so aus:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;

class Foo {
public:
    int value;

    Foo(int v) : value(v) {}


    bool operator&lt;(const Foo&amp; other) const {
        return value &lt; other.value;
    }
};


/*
bool operator&lt;(const Foo&amp; lhs, const Foo&amp; rhs) { // Kompiliert nicht
    return lhs.value &lt; rhs.value;
}
*/



int main() {
    std::vector&lt;Foo&gt; vec = { Foo{5}, Foo{1}, Foo{9}, Foo{3} };

    //std::sort(std::begin(vec), std::end(vec));  // (1) Kompiliert
    std::ranges::sort(vec);                   // (2) Kompiliert nicht
    /*
    std::ranges::sort(vec, [](const Foo&amp; f1, const Foo&amp; f2) {
        return f1 &lt; f2;
    });                                         // (3) Kompiliert
    */


    for (const auto&amp; f : vec) {
        std::cout &lt;&lt; f.value &lt;&lt; ' ';
    }
}
</code></pre>
<p>Das Problem taucht sowohl in VS, GCC, und CLANG auf.</p>
<p>Punkt (1) kompiliert und ist mein aktueller Stand, welcher ich auch so lasse.</p>
<p>Punkt (2) kompiliert nicht.</p>
<p>Punkt (3) war so mein erste Hack-Test.</p>
<p>Kommentiere ich den &lt; Operator mit zwei Parametern ein, so kompiliert das Programm nicht mehr.</p>
<p>Rein aus Interresse, was geht hier schief?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/355476/probleme-mit-std-sort-std-ranges-sort-und-eigenem-operator</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Jul 2026 13:54:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/355476.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 17 Jul 2026 07:25:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator on Fri, 17 Jul 2026 07:25:54 GMT]]></title><description><![CDATA[<p>Die Frage kam durch Clang-Tidy, wo empfohlen wurde std::sort durch std::ranges::sort zu ersetzen. Mache ich dies, so bekomme ich vom VS Compiler die Fehlermeldung:</p>
<blockquote>
<p>Fehler	C2672	&quot;operator __surrogate_func&quot;: keine übereinstimmende überladene Funktion gefunden</p>
</blockquote>
<p>Verkürzt sieht der Code so aus:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;

class Foo {
public:
    int value;

    Foo(int v) : value(v) {}


    bool operator&lt;(const Foo&amp; other) const {
        return value &lt; other.value;
    }
};


/*
bool operator&lt;(const Foo&amp; lhs, const Foo&amp; rhs) { // Kompiliert nicht
    return lhs.value &lt; rhs.value;
}
*/



int main() {
    std::vector&lt;Foo&gt; vec = { Foo{5}, Foo{1}, Foo{9}, Foo{3} };

    //std::sort(std::begin(vec), std::end(vec));  // (1) Kompiliert
    std::ranges::sort(vec);                   // (2) Kompiliert nicht
    /*
    std::ranges::sort(vec, [](const Foo&amp; f1, const Foo&amp; f2) {
        return f1 &lt; f2;
    });                                         // (3) Kompiliert
    */


    for (const auto&amp; f : vec) {
        std::cout &lt;&lt; f.value &lt;&lt; ' ';
    }
}
</code></pre>
<p>Das Problem taucht sowohl in VS, GCC, und CLANG auf.</p>
<p>Punkt (1) kompiliert und ist mein aktueller Stand, welcher ich auch so lasse.</p>
<p>Punkt (2) kompiliert nicht.</p>
<p>Punkt (3) war so mein erste Hack-Test.</p>
<p>Kommentiere ich den &lt; Operator mit zwei Parametern ein, so kompiliert das Programm nicht mehr.</p>
<p>Rein aus Interresse, was geht hier schief?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2625006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2625006</guid><dc:creator><![CDATA[Quiche Lorraine]]></dc:creator><pubDate>Fri, 17 Jul 2026 07:25:54 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator on Fri, 17 Jul 2026 08:49:39 GMT]]></title><description><![CDATA[<p>Glaube, du brauchst friend für den Vergleichsoperator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2625007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2625007</guid><dc:creator><![CDATA[Anon-81275]]></dc:creator><pubDate>Fri, 17 Jul 2026 08:49:39 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator on Fri, 17 Jul 2026 08:55:41 GMT]]></title><description><![CDATA[<p>Du musst den neuen operator&lt;=&gt; definieren! Dann übersetzt das auch problemlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2625008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2625008</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Fri, 17 Jul 2026 08:55:41 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator on Fri, 17 Jul 2026 08:58:01 GMT]]></title><description><![CDATA[<p>Zu schnell, man sollte sich mehr Mühe geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2625009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2625009</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Fri, 17 Jul 2026 08:58:01 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator on Fri, 17 Jul 2026 08:58:27 GMT]]></title><description><![CDATA[<p>JA:</p>
<blockquote>
<p>Ja, das kommt sehr häufig vor. Wenn du std::ranges::sort für eine Liste von eigenen Objekten aufrufst, muss die Funktion die Objekte miteinander vergleichen können. Dafür benötigt sie Zugriff auf den Kleiner-als-Operator (&lt;) oder eine benutzerdefinierte Vergleichsfunktion. [1]<br />
Wenn die Datenfelder deiner Klasse privat (private) sind, musst du diesen Operator oder die Funktion oft als friend deklarieren, damit er auf die internen Werte zugreifen darf.</p>
<h3>Warum friend bei std::ranges::sort wichtig ist</h3>
<p>Standardmäßig nutzt std::ranges::sort den Operator &lt;. In modernem C++ (ab C++20) nutzt man hierfür idealerweise den Drei-Wege-Vergleichsoperator (&lt;=&gt;), auch bekannt als Spaceship-Operator.<br />
Da dieser Operator außerhalb der Klasse als freie Funktion agiert oder die Argumente symmetrisch behandeln muss, benötigt er das Schlüsselwort friend, um die privaten Attribute der Klasse zu lesen.</p>
</blockquote>
<p>Vereinfacht gesagt: Dein compare op muss unabhängig vom Kontext der Klassen verwendet werden können, aber gleichzeitig Zugriff auf die Member der Klasse erhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2625010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2625010</guid><dc:creator><![CDATA[Anon-81275]]></dc:creator><pubDate>Fri, 17 Jul 2026 08:58:27 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator on Fri, 17 Jul 2026 09:01:14 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16792">@john-0</a> sagte in <a href="/forum/post/2625008">Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator</a>:</p>
<blockquote>
<p>Du musst den neuen operator&lt;=&gt; definieren! Dann übersetzt das auch problemlos.</p>
</blockquote>
<p>Ja, das sollte man auch beachten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2625011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2625011</guid><dc:creator><![CDATA[Anon-81275]]></dc:creator><pubDate>Fri, 17 Jul 2026 09:01:14 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator on Fri, 17 Jul 2026 09:19:01 GMT]]></title><description><![CDATA[<p>Ok, der Compiler mag mich überhaupt nicht. Wenn ich Folgendes</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;

class Foo {
        int value;
public:
        explicit Foo (const int v) : value(v) {}

        auto operator&lt;=&gt; (const Foo&amp; rhs) const = default;

        int get() const {
                return this-&gt;value;
        }
};

int main() {
    std::vector&lt;Foo&gt; vec = { Foo{5}, Foo{1}, Foo{9}, Foo{3} };

    std::ranges::sort(vec);

    for (const auto&amp; f : vec) {
        std::cout &lt;&lt; f.get() &lt;&lt; ' ';
    }
    std::cout &lt;&lt; &quot;\n&quot;;
}
</code></pre>
<p>eingebe übersetzt er es problemlos, und es gibt ein richtiges Ergebnis. Wenn ich versuch den operator&lt;=&gt; selbst zu schreiben, wirft er mir einen Fehler. Momentan hadere ich damit, dass ich das nicht nachvollziehen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2625012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2625012</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Fri, 17 Jul 2026 09:19:01 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator on Fri, 17 Jul 2026 09:27:05 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16792">@john-0</a></p>
<p>dass der Compiler bei deinem selbstgeschriebenen operator&lt;=&gt; streikt, liegt an den strengen Concepts von C++20 Ranges.<br />
Damit ein Typ mit std::ranges::sort sortiert werden kann, muss er das Concept std::sortable erfüllen. Dieses baut wiederum auf std::totally_ordered auf. Das bedeutet für dich: Ein Typ ist für Ranges nur dann sortierbar, wenn er sowohl eine Ordnung (&lt;) als auch eine Gleichheit (==) besitzt.</p>
<h3>Warum funktioniert = default?</h3>
<p>Wenn du auto operator&lt;=&gt;(const Foo&amp;) const = default; schreibst, ist der Compiler so nett und generiert für dich implizit auch gleich den passenden Gleichheitsoperator (operator==) mit. Damit ist die Bedingung für std::totally_ordered erfüllt.</p>
<h3>Warum scheitert die manuelle Version?</h3>
<p>Wenn du den operator&lt;=&gt; von Hand schreibst, generiert der Compiler den operator== nicht automatisch. std::ranges::sort sieht also eine Klasse, die man zwar vergleichen, aber nicht auf Gleichheit prüfen kann – und bricht mit einem kryptischen Compiler-Fehler ab.</p>
<h3>Die Lösung</h3>
<p>Wenn du den Spaceship-Operator selbst implementierst, musst du den operator== entweder ebenfalls manuell schreiben oder ihn separat via = default anfordern:</p>
<pre><code class="language-cpp">class Foo {
    int value;public:
    explicit Foo(const int v) : value(v) {}

    // 1. Dein manueller Spaceship-Operator für die Ordnung
    auto operator&lt;=&gt;(const Foo&amp; rhs) const {
        return this-&gt;value &lt;=&gt; rhs.value;
    }

    // 2. WICHTIG FÜR RANGES: Der Gleichheitsoperator (kann defaulted werden)
    bool operator==(const Foo&amp; rhs) const = default; 

    int get() const { return this-&gt;value; }
};
</code></pre>
<p>Sobald der operator== vorhanden ist, kompiliert dein Code auch mit der manuellen Variante fehlerfrei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2625013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2625013</guid><dc:creator><![CDATA[Anon-81275]]></dc:creator><pubDate>Fri, 17 Jul 2026 09:27:05 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator on Fri, 17 Jul 2026 09:53:36 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/39198">@Anon-81275</a> sagte in <a href="/forum/post/2625013">Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator</a>:</p>
<blockquote>
<h3>Warum scheitert die manuelle Version?</h3>
<p>Wenn du den operator&lt;=&gt; von Hand schreibst, generiert der Compiler den operator== nicht automatisch. std::ranges::sort sieht also eine Klasse, die man zwar vergleichen, aber nicht auf Gleichheit prüfen kann – und bricht mit einem kryptischen Compiler-Fehler ab.</p>
</blockquote>
<p>Aua, der operator&lt;=&gt; wurde doch eingeführt, weil er eben direkt „Kleiner als“, „Gleichheit“ und „Größer als“ ausdrücken kann, und da muss man explizit die Gleichheit nochmals implementieren? Kein Wunder, wenn C++ immer ins Hintertreffen gerät – das ist unlogisch. Früher wusste man, dass operator== und operator&lt; zu implementieren ist.</p>
<p>Danke für den Hinweis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2625014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2625014</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Fri, 17 Jul 2026 09:53:36 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator on Fri, 17 Jul 2026 10:39:40 GMT]]></title><description><![CDATA[<p>Ja, ich bin auch kein C++-&quot;Stammspieler&quot;, aber ich sehe das so ähnlich wie du. Ich glaube, das ist so etwas ähnliches wie Ballast, der einfach die Komplexität erhöht. Mir fällt jedenfalls spontan kein sinnvoller Use-Case ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2625015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2625015</guid><dc:creator><![CDATA[Anon-81275]]></dc:creator><pubDate>Fri, 17 Jul 2026 10:39:40 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator on Fri, 17 Jul 2026 12:04:43 GMT]]></title><description><![CDATA[<p>Danke Leute, ich habe die Operatoren &lt;=&gt; und == definiert und damit funktioniert das std::ranges::sort auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2625016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2625016</guid><dc:creator><![CDATA[Quiche Lorraine]]></dc:creator><pubDate>Fri, 17 Jul 2026 12:04:43 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator on Fri, 17 Jul 2026 12:22:19 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16792">@john-0</a> sagte in <a href="/forum/post/2625014">Probleme mit std::sort, std::ranges::sort und eigenem &lt; Operator</a>:</p>
<blockquote>
<p>Kein Wunder, wenn C++ immer ins Hintertreffen gerät – das ist unlogisch.</p>
</blockquote>
<p>Uff, ehrlich gesagt juckt mich das nicht.</p>
<p>Das muss man wissen, man könnte es auch als eine Macke bezeichnen, aber die Schönheit eine Sprache ist eine Sache, die Stilblüten der Benutzer eine andere.</p>
<p>Ich sehe da gerade eine Design-Pattern Seuche.</p>
<pre><code class="language-cpp">class UART_Base
{

}
class UART_1 : public UART_Base
{
  UART_1* GetInstance()...
}

UART_BASE* GetInstance(int Mode)
{
   if (Mode == 1)
      return UART_1.GetInstance();
  if (mode == 2)
     return UART_2.GetInstance();
}
</code></pre>
<p>Und gerade sehe ich in der Android Welt so eine schöne Mischung aus Java und Kotlin. Gradle ist so lahm wie eh und je.  Man schießt gerne mit Kanonen auf Spatzen in dem man eine z.B. eine Kommunikation IO in einen eigenen Prozess auslagert und mittels Sockets darauf zugreift.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2625017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2625017</guid><dc:creator><![CDATA[Quiche Lorraine]]></dc:creator><pubDate>Fri, 17 Jul 2026 12:22:19 GMT</pubDate></item></channel></rss>