Use .json() as required.

(1) Tamer doesn't interact that well with certain uses of preprocessor conditionals.

(2) You were creating a tamer::event&lt;RPC_Msg&gt;. In terms of your mail:

A) Is this the correct understanding of the issue?
Yes, it is. Only in very few cases does C++ consider the context of an expression when computing that expression's type. Here, tamer::make_event(rpc_request) has a known type, tamer::event&lt;RPC_Msg>. This cannot be cast to tamer::event&lt;Json>, *even though* RPC_Msg& can be cast to Json&.

B) Is there a way around this besides adding a custom definition for mpfd::read_request or explicitly extracting a reference to the Json object before passing it to mpfd::read_request?
Not currently. The below is the easiest & best solution.