c ++ 11 — Невозможно объявить типизированный актер в C ++ Actor Framework

Я пытаюсь объявить строго типизированного актера в C ++ Actor Framework (CAF), но мой код по какой-то причине не компилируется. Не могли бы вы сказать мне, что с ним не так?

#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>> >;

Сообщение об ошибке:

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>)'

Но если я заменю DiscoverRequest<TNum> а также DiscoverResponse<TNum> с конкретными экземплярами, как, например, DiscoverRequest<float>, это хорошо компилируется. Итак, я думаю, что что-то во внутренних органах CAF запрещает использование такой конструкции.

Мой компилятор GCC G ++ 4.9.2 (с -std=c++11, конечно), работает на Fedora 21. CAF является последняя редакция его master ветка, связанная с проектом в виде подмодуля Git.

4

Решение

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

По вопросам рекламы [email protected]