我正在尝试在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
添加这些行:
namespace myspace {
....
}
围绕]的实现>
Queue::....
哇! 5年前!对于现在偶然发现此问题的任何人!