Qui è il mio esempio di codice:overloading degli operatori ->
class X
{
public:
void f() {}
};
class Y : public X
{
public:
X& operator->() { return *this; }
void f() {}
};
int main()
{
Y t;
t.operator->().f(); // OK
t->f(); // error C2819: type 'X' does not have an overloaded member 'operator ->'
// error C2232: '->Y::f' : left operand has 'class' type, use '.'
}
Perché il compilatore sta cercando di "spostare la responsabilità" per la seconda del gestore> da Y a X? Quando implemento X :: op-> quindi non posso restituire X lì - l'errore di compilazione dice "ricorsione infinita" mentre restituisco un po di Z da X :: op-> di nuovo dice che Z non ha operatore->, andando così in alto e più in alto nella gerarchia.
Qualcuno può spiegare questo comportamento interessante? :)
io non direi che è supponiamo di restituire un puntatore, basta che qualunque cosa ritorna deve supportare 'del gestore>'. – GManNickG
@ GMan- Buon punto. Stavo andando per semplicità qui, ma tu hai ragione. Ci sono alcuni trucchi davvero divertenti che puoi utilizzare con puntatori intelligenti basati su questa tecnica. – templatetypedef
@GMan: Poiché tali tipi sono chiamati collettivamente * puntatori intelligenti *, non penso che templatetypedef abbia torto ad usare il termine * puntatore *, lo sta semplicemente usando in senso generale. –