Fórumok
Hello,
van egy ilyen kód (kipucolva, leegyszerüsítve, hátha valakit tényleg érdekel :))
#include <iostream>
#include <maxminddb.h>
class MyClass {
public:
bool lookup(const std::string& name);
private:
MMDB_s mmdb;
};
bool MyClass::lookup(const std::string& target) {
int gai_error, mmdb_error;
MMDB_lookup_result_s r;
r = MMDB_lookup_string(&mmdb, target.c_str(), &gai_error, &mmdb_error);
return true;
}
int main() {
MyClass *c;
c = new MyClass();
std::string s = "foo";
c->lookup(s);
return 0;
}
Ez ezzel a paranccsal le is fordul:
g++ prog.cc -lmaxminddb
(clang-al is).
Ha a lookup() fv-t const-ra módosítom, akkor a fordító (mindegyik) elkezd rinyálni, de az MMDB_lookup_string()-re:
bool lookup(const std::string& name) const;
...
bool MyClass::lookup(const std::string& target) const {
prog.cc: In member function 'bool MyClass::lookup(const string&) const':
prog.cc:17:28: error: invalid conversion from 'const MMDB_s*' to 'MMDB_s*' [-fpermissive]
17 | r = MMDB_lookup_string(&mmdb, target.c_str(), &gai_error, &mmdb_error);
| ^~~~~
| |
| const MMDB_s*
In file included from constcheck.cc:2:
/usr/include/x86_64-linux-gnu/maxminddb.h:204:66: note: initializing argument 1 of 'MMDB_lookup_result_s MMDB_lookup_string(MMDB_s*, const char*, int*, int*)'
204 | extern MMDB_lookup_result_s MMDB_lookup_string(MMDB_s *const mmdb,
| ~~~~~~~~~~~~~~^~~~
Tud segíteni valaki ennek megértésében? Miért a fv törzsön belül egy másik fv argumentumánál panaszkodik, és miért csak akkor, ha ha fv const? Ennélkül miért fogadja el?
Hozzászólások
A const metódus lényege, hogy nem változtathatja meg az objektum állapotát. Más szóval egy const metódusban a te ojjektumod (this pointer) is const, és következésképp a benne lévő összes tagváltozó is az. Így mivel az 'mmdb' tagváltozó const, ezért a fordító olyan MMDB_lookup_string() függvényt keres, ami egy const MMDB_s példányra mutató pointert vár, de ilyet nem talál, csak olyat, ami egy MMDB_s példányra mutató const pointert vár. (Ha jól értettem... a különböző helyekre tett const jelentésébe könnyen bele lehet zavarodni.) A const-ságot pedig nem lehet csak úgy implicit elkonvertálni, ezért hibát jelez.
A maxmindb frissítése megoldást jelenthet a problémára, lásd: https://github.com/maxmind/libmaxminddb/commit/0cc6caecc8118ca4b4c96c75…
A const metódus lényege, hogy nem változtathatja meg az objektum állapotát.
Ahha, mármint ha a const a fv neve után van, akkor lesz maga a fv const (egyébként (pl const bool fv()) ugye egy olyan fv, aminek a visszatérési értéke lesz const). Na, ezt nem értettem pl, köszi.
ami egy const MMDB_s példányra mutató pointert vár, de ilyet nem talál, csak olyat, ami egy MMDB_s példányra mutató const pointert vár
Háá, ezt is értem - nagyon köszönöm! :)
Igen, a const (főleg így) eléggé be tud kavarni.
Köszi a linket, megnézem, újabb verzióval működik-e. És köszi mindent.