Aquí está mi ejemplo de código:sobrecarga de operadores ->
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 '.'
}
Por qué el compilador está tratando de "mover la responsabilidad" por operator-> de Y a X? Cuando implemente X :: OP> entonces no puedo volver allí X - error de compilación dice "bucle infinito", mientras que devolver algunos de Z X :: OP> de nuevo dice que Z no tiene del operador>, yendo así más alto y más alto en jerarquía.
Puede alguien explicar este comportamiento interesante? :)
yo no diría que es supone para devolver un puntero, al igual que todo lo que devuelve las necesidades del operador para apoyar '>'. – GManNickG
@ GMan- Buen punto. Me iba por la simplicidad aquí, pero estás en lo cierto. Hay algunos trucos realmente divertidos que puede realizar con punteros inteligentes que se basan en esta técnica. – templatetypedef
@GMan: dado que estos tipos se denominan colectivamente * punteros inteligentes *, no creo que templatetypedef esté equivocado al usar el término * puntero *, simplemente lo está usando en un sentido general. –