no match function for call ... near match

Eine Methode einer Klasse findet eine offensichtlich existierende Funktionen nicht.

Das Problem

In letzter Zeit stolperte ich häufiger über Fehlermeldungen wie diese. Der GCC meldet dabei eine korrekte Fehlermeldung.

Die rufende Funktion ist mit dem const-Attribut gekennzeichnet und soll eine andere Memberfunktion des gleichen Objekts auf. Dabei tritt folgende Fehlermeldung auf, hier als Beispiel mit dem Vergleichsoperator:

g++ | pointcloud (de/xsd/geo).....
In file included from ../../../de/xsd/geo/pointcloud.h:5,
                 from ../../../de/xsd/geo/pointcloud.cpp:1:
../../../de/xsd/geo/point.h: In member function ‘bool XSD::Geo::Point::operator==(const XSD::Geo::Point&) const’:
../../../de/xsd/geo/point.h:178: error: no matching function for call to ‘XSD::Geo::Point::operator==(const XSD::Geo::Point&) const’
../../../de/xsd/geo/point.h:63: note: candidates are: bool XSD::Geo::PointTpl<type, positionType>::operator==(const type&) [with type = XSD::Geo::Point, positionType = double] <near match>

Der Unterschied ist leicht zu übersehen, daher habe ich dieses Problem in die FAQ übernommen.

Visual Studio meldet hier, dass keine passende Funktion gefunden wird, ohne irgendeinen Hinweis auf eine vorhandene Funktion ohne das const-Attribut.

Der Fehler

Gesucht wird ein operator ==, der mit dem const-Attribut gekennzeichnet ist. Der Near-Match ist allerdings ein operator ==, dem das const-Attribut fehlt.

Die Problemlösung

In diesem Fall lässt sich das Problem einfach lösen, da ein Vergleich keine Änderung am eigentlichen Objekt erforderlich macht. Zur Problemlösung muss entsprechend eine Funktion gleicher Signatur erstellt werden, die das const-Attribut trägt, bzw. die vorhandene Funktion muss mit dem const-Attribut nachgerüstet werden, so dass sie selbst keine Funktionen mehr ruft, die über kein const-Attribut verfügen.