Вы не можете.
Во-первых, this
не обязательно является const Foo *
. this
будет const Foo *
- это метод const класса Foo
. В неконстантном методе this
это просто Foo *
. (На самом деле ваше сообщение об ошибке упоминает Foo* const
. Где вы видели const Foo *
?)
Во-вторых, и что более важно, this
не является lvalue. Вы не можете иметь указатель на this
. Вы не можете иметь непостоянную ссылку на this
. Единственное, что вы можете иметь, это постоянное почтение к this
, то есть ссылка типа Foo *const &
.
Это (Foo *const &
) будет работать в вашем случае.
void do_baz(Foo* const& pFoo) {
pFoo->p_sub_foo = new Foo;
}
Но я не вижу смысла во всем этом. Просто объявите обычный Foo *
указатель как параметр для вашего do_baz
метода
void do_baz(Foo* pFoo) {
pFoo->p_sub_foo = new Foo;
}
и получите тот же результат. Как вы думаете, для чего вам нужна эта ссылка?
EDIT : принимая во внимание ваше редактирование, то, что вы пытаетесь сделать, не может быть выполнено с помощью одной do_baz
функции, поскольку при первом вызове вы потенциально (семантически) пытаетесь изменить this
, что невозможно (даже если код модификации никогда не будет выполнен на практике). Хотите вы этого или нет, у вас не может быть неконстантной ссылки на this
, даже если вы не собираетесь ничего через нее писать. Возможно, вам придется реализовать самый первый вызов с другой функцией
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
}
и затем сделайте первый звонок как
void bar() {
do_baz_root(this);
}