【问题标题】:Cannot declare template typed actor in C++ Actor Framework无法在 C++ Actor Framework 中声明模板类型的 Actor
【发布时间】:2015-07-16 04:59:30
【问题描述】:

我试图在C++ actor framework (CAF) 中声明一个强类型的actor,但我的代码由于某种原因无法编译。你能告诉我它有什么问题吗?

#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&lt;TNum&gt;DiscoverResponse&lt;TNum&gt; 替换为特定的实例,例如 DiscoverRequest&lt;float&gt;,它确实可以很好地编译。所以,我认为 CAF 内部的某些东西禁止使用这种结构。

我的编译器是 GCC G++ 4.9.2(当然是 -std=c++11),在 Fedora 21 上运行。CAF 是其 master 分支的 latest revision,作为 Git 子模块链接到项目。

【问题讨论】:

  • 我认为它错过了template关键字,试试caf::replies_to&lt;DiscoverRequest&lt;TNum&gt;&gt;::template with&lt;DiscoverResponse&lt;TNum&gt;&gt;
  • @Jarod42: typename caf::replies_to&lt;DiscoverRequest&lt;TNum&gt;&gt;::template with&lt;DiscoverResponse&lt;TNum&gt;&gt; 似乎有效,感谢您的想法!你应该把你的评论变成一个答案,这样我才能批准它。

标签: c++ c++11 actor c++-actor-framework


【解决方案1】:

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

【讨论】:

  • 原来它也必须有typename关键字:typename caf::replies ...
  • @firegurafiku:已修复。
【解决方案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>>;

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

【讨论】:

  • 很可能是@firegurafiku 想在以后加强当前空的结构。但如果不是这样,这看起来肯定更干净。
  • @neverlord:感谢您展示了如何在类型化的 Actor 接口中声明元组消息的方式,我没有从阅读手册中得到它。
  • @matthias-vallentin:是的,结构目前是空的。在这里,我尝试从确切的消息结构中抽象出来,这就是我使用自定义类的原因。但可能基于原子的方法会更好,我不确定。
猜你喜欢
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 2012-03-10
  • 2020-07-09
相关资源
最近更新 更多