considerare:
#include <cstdlib>
class Bar {};
class Foo
{
public:
Foo (Bar& bar)
:
mBar (bar)
{
}
const Bar& get() const
{
return mBar;
}
private:
Bar& get()
{
return mBar;
}
Bar& mBar;
};
int main()
{
Bar bar;
Foo foo (bar);
Bar& ref = foo.get();
}
Nel punto della chiamata: const Bar& ref = foo.get();
ci si potrebbe aspettare la versione const
di get()
di essere chiamato, perché si sta assegnando un riferimento const
.
Ma questo non è il caso. I tipi restituiti non fanno parte della firma di una funzione (o di un metodo), quindi quando il compilatore sta cercando la funzione da richiamare in un elenco di possibili overload, il tipo restituito non viene considerato. (In effetti, lo standard rifiuta gli overload di funzioni che differiscono solo per il tipo di ritorno.)
Quindi, come fa il compilatore decide quale funzione chiamare? Osservando le informazioni è disponibile ad esso. I sovraccarichi tweo sono identici in termini di parametri (entrambi sono void
), quindi l'unica cosa che deve andare è il tipo statico dell'oggetto utilizzato per effettuare la chiamata: foo
. Quel tipo statico in questo caso è Foo
- decisamente non const
.
Pertanto, ha provato a chiamare l'unica funzione possibile: la versione non const
di get()
. Che, naturalmente, non verrà compilato perché è private
.
Per fox questo, il tipo statico può essere modificata per essere un const Foo
(o qualcosa di simile), in questo modo:
Foo foo (bar);
Bar& ref = foo.get();
O forse ...
Foo foo (bar);
const Bar& ref = static_cast <const Foo&> (foo).get();
Ma in pratica, vorrei piuttosto consigliare che i nomi di queste funzioni siano ambigui, piuttosto che fare affidamento su tali "trucchi" per contorcere il compilatore nel fare quello che vuoi.
fonte
2013-06-12 14:19:10
potrebbe .... const * navtmpmesh = navmesh; navmesg-> GetTile (i); lavoro? – UldisK
'const_cast (navmesh) -> getTile();' –
BoBTFish
Se non sbaglio, quale funzione il compilatore sceglie di chiamare mai è deciso dal tipo restituito (che è il motivo per cui non puoi avere int foo (int) e void foo (int)). Hai provato a trasmettere il comando navmesh a un puntatore a un oggetto const? Inoltre, il fatto che sia necessario un cast per gestire la scelta della funzione "corretta" probabilmente significa che è necessario rielaborare la propria API. –