Unable to declare template actor in C ++ Actor Framework

I am trying to declare a strongly typed actor in the C ++ actionor framework (CAF) , but my code does not compile for some reason. Could you tell me what is wrong with him?

#include "caf/all.hpp"

template <typename TNum>
class DiscoverRequest {};

template <typename TNum>
class DiscoverResponse {};

template <typename TNum>
class DataRequest {};

template <typename TNum>
class DataResponse {};

template <typename TNum>
using BlockActor = caf::typed_actor<
    /* ERROR NEXT LINE */
    caf::replies_to<DiscoverRequest<TNum>>::with<DiscoverResponse<TNum>>,
    caf::replies_to<DataRequest<TNum>>    ::with<DataResponse<TNum>> >;

Error message:

Block.hh:13:71: error: type/value mismatch at argument 1 in template
parameter list for 'template<class ... Sigs> class caf::typed_actor'

caf::replies_to<DiscoverRequest<TNum>>::with<DiscoverResponse<TNum>>,
                                                                  ^
Block.hh:13:71: error: expected a type, got   
'(caf::replies_to<DiscoverRequest<TNum> >::with < <expression error>)'

But if I replaced DiscoverRequest<TNum>it DiscoverResponse<TNum>with specific instances, for example DiscoverRequest<float>, it compiles fine. So, I think something in the CAF internals prohibits the use of such a construct.

My compiler is GCC g ++ 4.9.2 (with -std=c++11, of course) running on Fedora 21. CAF is the latest version of its branch masterrelated to the project as a submodule of Git.

+4
source share
2

template .

template <typename TNum>
using BlockActor = caf::typed_actor<
    typename caf::replies_to<DiscoverRequest<TNum>>::template with<DiscoverResponse<TNum>>,
    typename caf::replies_to<DataRequest<TNum>>    ::template with<DataResponse<TNum>> >;
+2

Jarod42 , . , :

using discover_request_atom = atom_constant<atom("DiscoverRq")>;

using discover_response_atom = atom_constant<atom("DiscoverRs")>;

using data_request_atom = atom_constant<atom("DataRq")>;

using data_response_atom = atom_constant<atom("DataRs")>;

template <class TNum>
using BlockActor = caf::typed_actor<
    replies_to<discover_request_atom, TNum>::with<discover_response_atom, TNum>,
    replies_to<data_request_atom, TNum>    ::with<data_response_atom, TNum>>;

, .

+2

All Articles