4

我试图在C++ 演员框架 (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>and替换DiscoverResponse<TNum>为特定的实例,例如 ,DiscoverRequest<float>它确实可以很好地编译。所以,我认为 CAF 内部的某些东西禁止使用这种结构。

我的编译器是在 Fedora 21 上运行的GCC G++ 4.9.2(当然-std=c++11是.master

4

2 回答 2

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>> >;
于 2015-05-06T07:57:48.293 回答
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>>;

这可以让您在以后避免很多麻烦,因为它可以避免您宣布每个模板实例。

于 2015-05-06T08:39:31.113 回答