我试图通过使用C++中包含的异步代理库(AAL)来调用两个独立的线程(有关AAL的描述http://msdn.microsoft.com/en-us/library/dd492627.aspx,请参阅此处)。代理库允许您通过基于数据流而非控制流的异步通信模型连接隔离的组件,从而提供了共享状态的替代方法。数据流是指一种编程模型,在该模型中,当所有必需数据均可用时进行计算。控制流是指以预定顺序进行计算的编程模型。

因为我不想等待来自一个代理的任意数据,所以我想使用Concurrency::send()和Concurrency::try_receive()。
但是,我在实现try_receive方法时遇到了问题(可以在此处找到文档http://msdn.microsoft.com/de-de/library/dd470874.aspx)。

我当前的实现:

ISource<bool>& _source;
Concurrency::try_receive(_source, &Received,ITarget<CPlant*>::filter_method())

使用CPlant作为我的数据发送回_source-Message来源的代理。 Agent1发送一个简单的 bool(boolean) 值“true”,Agent2(包括上面提到的代码)响应使用CPlant类。这与Concurrency::receive()一起工作,但是我不想阻止当前代理的进一步执行。

你有一个线索为什么我会编译错误
1>c:\users\robert\tum\da\src\sim\anlagensim\anlagensim\main.cpp(57): error C2782: 'bool Concurrency::try_receive(Concurrency::ISource<_Type> &,_Type &,const ITarget<_Type>::filter_method &)' : template parameter '_Type' is ambiguous
1>          c:\program files\microsoft visual studio 10.0\vc\include\agents.h(16553) : see declaration of 'Concurrency::try_receive'
1>          could be 'int *'
1>          or       'bool'
1>c:\users\robert\tum\da\src\sim\anlagensim\anlagensim\main.cpp(57): error C2780: 'bool Concurrency::try_receive(Concurrency::ISource<_Type> &,_Type &)' : expects 2 arguments - 3 provided



在此先感谢您的帮助!

最佳答案

我从来没有对这个库做任何事情,但是看一下您想匹配的函数签名:

template <
   class _Type
>
bool try_receive(
   ISource<_Type> & _Src,
   _Type & _value,
   typename ITarget<_Type>::filter_method const& _Filter_proc
);
try_receive的所有三个参数期望使用相同的_Type。查看调用方式,您将ISource<bool>参数传递给_Src(因此希望_Typebool,而要传递_Filter_proc则传递ITarget<CPlant*>参数(因此应将_Type传递给CPlant*)。 ,导致编译器感到困惑,无法解析该函数​​,并尝试依靠该函数的其他重载,这就是为什么您会收到奇怪的错误的原因。

由于我没有使用该库,因此无法告诉您应该传递的内容,但是我想您可能应该使用bool != CPlant*(或ISource<CPlant*>作为_Type而不是CPlant)。

请注意,第二个参数也是CPlant*类型,因此_Type需要使用与其他参数相同的模板类型(从您的问题中不清楚此参数当前是哪种类型)。

10-06 09:06