No puede.
En primer lugar, this
no es necesariamente un const Foo *
. this
sería const Foo *
es un método const de la clase Foo
. En un método no const this
es solo Foo *
. (En realidad su mensaje de error menciona Foo* const
. ¿Dónde viste const Foo *
?)
En segundo lugar, y más importante aún, this
no es un valor izquierdo. No puede tener un puntero a this
. No puede tener una referencia no constante a this
. Lo único que puede tener es una const reverence a this
, es decir, una referencia de tipo Foo *const &
.
(Foo *const &
) funcionará en su caso.
void do_baz(Foo* const& pFoo) {
pFoo->p_sub_foo = new Foo;
}
Pero no veo el sentido de todo esto. Sólo declarar un puntero Foo *
normal, como parámetro para su do_baz
método
void do_baz(Foo* pFoo) {
pFoo->p_sub_foo = new Foo;
}
y obtener el mismo resultado. ¿Para qué crees que necesitas esa referencia?
EDITAR: Teniendo en cuenta su edición, lo que está tratando de hacer, no se puede hacer con una sola función do_baz
, ya que en la primera llamada que le potencialmente (semánticamente) intento de modificar this
, lo cual es imposible (incluso si el código de modificación nunca se ejecutará en la práctica). Ya sea que lo quiera o no, no puede tener una referencia no constante al this
, incluso si no tiene la intención de escribir nada a través de él. Es probable que tenga que aplicar la primera llamada con una función diferente
void do_baz(Foo*& pFoo) {
if (pFoo == NULL) {
pFoo = new Foo;
return;
}
//other stuff
do_baz(pFoo->p_sub_foo);
//more stuff
}
void do_baz_root(Foo* pFoo) {
assert(pFoo != NULL);
//other stuff
do_baz(pFoo->p_sub_foo);
//more stuff
}
y luego hacer la primera llamada como
void bar() {
do_baz_root(this);
}
acaba de deshacerse de la &. –