AFAIU объект, возвращаемый из add_field в Event :: Builder, будет [...]
Вы применяете рассуждение более высокого уровня. Что может предполагать компилятор? Он видит, что add_field()
возвращает AbstractBuilder&
, и вы пытаетесь вернуть это (из event()
и payload()
) как Builder&
. Как это может быть сделано? В общем, это невозможно, поскольку не каждый AbstractBuilder
является Builder
.
Если вы абсолютно уверены, что add_field
вернет *this
(даже после будущих изменений кода), вы можете явно указать компилятору предположить, что возвращенная ссылка является подобъектом Builder
.
return static_cast<Builder&>(add_field("event", event));
Однако это fr agile, поскольку компилятор не может определить, нарушается ли ваше предположение (в будущее). Возможно, вы захотите добавить утверждение времени выполнения для обнаружения поломки. Меньше fr agile будет заставлять эти функции возвращать *this
:
add_field("event", event);
return *this;
Это имеет свой собственный недостаток в том, что ваш код повторяется. (Если вы когда-нибудь измените семантику того, что возвращают эти функции, у вас будет несколько мест для изменения.) Необходимо сделать вывод о том, какой подход предпочтительнее, или, возможно, следует переосмыслить общий дизайн.