const XX discards qualifiers [- fpermissive]
Im code-snippet 1 unten, mKnownSRList ist wie folgt definiert:
std::vector<EndPointAddr*> mKnownSRList;
Ich bin immer ein Kompilierungsfehler angezeigt, die im code-snippet 2. Können Sie mir sagen, was ist falsch an diesem code bitte? Die Inhalte der getTipcAddress() und compareTo-Funktionen sind dargestellt in der code-snippet 3 und 4 unten.
CODE-SNIPPET 1 (Kompilierung Fehler ist markiert)
void
ServiceRegistrarAPI::removeKnownSR(EndPointAddr & srEndPointAddr)
{
auto last =
std::remove_if(mKnownSRList.begin(),
mKnownSRList.end(),
[srEndPointAddr]( EndPointAddr* o )
{
//LINE 355 is the following
EndPointTipcAddr myTipcAddress = srEndPointAddr.getTipcAddress();
EndPointTipcAddr otherTipcAddress = o->getTipcAddress();
return (myTipcAddress.compareTo(otherTipcAddress));
});
if(*last != nullptr)
{
delete *last;
}
mKnownSRList.erase(last, mKnownSRList.end());
}
SNIPPET 2 (Kompilierungsfehler)
ServiceRegistrarAPI.cpp:355:72: error: passing ‘const EndPointAddr’ as ‘this’ argument of ‘EndPointTipcAddr& EndPointAddr::getTipcAddress()’ discards qualifiers [- fpermissive]
CODE-SNIPPET 3 (getTipcAddress Funktion)
EndPointTipcAddr & getTipcAddress() { return mTipcAddress; }
CODE NIPPET 4 (compareTo-Funktion)
bool
EndPointTipcAddr::compareTo(EndPointTipcAddr &rhs)
{
if( (mType == rhs.getType()) && (mInstanceNo == rhs.getInstanceNo()) )
{
return true;
}
return false;
}
- Noch nicht berücksichtigt diese im detail, aber ich glaube, dies wird von Bedeutung sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem Prädikat-Funktion (Dritte argument von
std::remove_if
) ist nicht erlaubt, das Objekt ändern. Alle Methoden genannt, die auf der iterator mussconst
. Sehen diese Dokumentation:Können Sie festlegen
getTipcAddress
zuconst
wenn Sie wieder eine Kopie eines Wertes oder einerconst
Zeiger.Siehe S5.1.2.5:
Grundsätzlich, das heißt der operator() der Funktor, der generiert wird, ist
const
standardmäßig, und Sie erfasst haben, von Wert, und diese aufgenommenen variable ist ein Element der generierten Funktor.So, haben Sie zwei Optionen:
Ändern Sie Ihre lambda-Ausdruck Folgendes ein (beachten Sie die
mutable
folgenden parameter Erklärung-Klausel):[srEndPointAddr](EndPointAddr* o) mutable { ... }
Kurz gesagt, Sie erhalten diesen Fehler, weil man sich auf eine non-const Methode auf ein const-Instanz in diesem Fall:
srEndPointAddr
ist const aber Sie berufen sich auf die nicht-const-MethodegetTipcAddress
auf Sie. Die Lösung für Sie sein würde, zu erklären, dass diese Methode const, wie es scheint, eine einfache getter-und wird wahrscheinlich nicht das Objekt ändern.Es ist eine Antwort, wie das problem zu lösen, nicht warum macht Fehler (Dank juanchopanza)
Ich vermute, Sie haben ein problem mit const-Qualifizierer.
Hinzufügen
const
-qualifizierte überlast fürgetTipcAddress
:und fügen Sie eine
const
am Ende dercompareTo
: