我正在尝试在c++(GCD)队列周围编写grand-central-dispatch包装器。
我在头文件中有这样的内容
#include <dispatch/dispatch.h>
namespace myspace {
class Queue
{
public:
Queue(dispatch_queue_t dispatchQueue);
private:
dispatch_queue_t dispatchQueue_;
}
}
标题的对应部分是.mm文件,带有实现。
我将Queue.h导入到其他纯C ++文件中,并在链接时得到:
Undefined symbols for architecture armv7:
"myspace::Queue::Queue(dispatch_queue_s*)", referenced from:
myspace::NiceClass::CreateOneMoreQueue() in NiceClass.o
在NiceClass中,我创建了一个新的队列:
Queue *queue = new Queue(dispatch_get_main_queue());
我坚持这个。好像我不能这样做。我可以将dispatch_queue_t
更改为void*
并且它的工作方式类似,但我丢失了类型信息并获得了大量演员。
我会很感激。
编辑:这是Queue.mm中的实现。内存管理和其他细节省略。
Queue::Queue(dispatch_queue_t dispatchQueue)
{
dispatchQueue_ = dispatchQueue;
if (dispatchQueue_ == NULL) {
dispatchQueue_ = dispatch_get_main_queue();
}
}
void Queue::AddMessage(Handler *handler, Context *context)
{
Message *msg = new Message;
msg->phandler = handler;
msg->context = context;
dispatch_async(dispatchQueue_, ^{
handler->ProcessMessage(msg);
});
}
EDIT2:这是一个对我失败的测试项目zip 32k
答案 0 :(得分:1)
哇! 5年前!对于现在偶然发现此问题的任何人!
如果myspace是一个'cpp'(纯C ++)文件,而Queue是一个'mm'(ObjC ++)文件,则在传递“分发”对象时会遇到跨语言障碍的链接器故障,因为它们是ObjC ++中的NSObject。 / p>
将双方都更改为“ .mm”,它将解决链接器问题。
答案 1 :(得分:0)
添加以下行:
namespace myspace {
....
}
执行
Queue::....