我试图在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
分支的latest revision,链接到项目作为Git子模块。
答案 0 :(得分: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>> >;
答案 1 :(得分: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>>;
这可以让您在以后遇到很多麻烦,因为它可以保证您宣布每个模板实例。