【发布时间】:2012-12-22 15:20:21
【问题描述】:
我正在尝试编写一个可移植的线程抽象。现在我有一个编译 dn 的代码可以在 Unix 上工作,但不能在 Windows 上编译(使用 VS2010)。
class Thread
{
public:
Thread();
~Thread();
template<typename Callable, typename Arg>
void startThread(Callable c, Arg a);
void killThread();
private:
template<typename Bind>
struct nested
{
static DWORD WINAPI run(void *obj)
{
Bind * b = reinterpret_cast<Bind *>(obj);
return (b->exec());
}
};
template<typename Callable, typename Arg>
class Binder
{
public:
Binder(Callable c, Arg a): _call(c), _arg(a) {}
~Binder() {}
DWORD operator()() {return (this->_call(this->_arg))}
DWORD exec() {return (this->_call(this->_arg))}
private:
Callable _call;
Arg _arg;
};
HANDLE _handle;
DWORD _id;
bool _isRunning;
DWORD _exitValue;
};
template<typename Callable, typename Arg>
void Thread::startThread(Callable c, Arg a)
{
Thread::Binder<Callable, Arg> *b =
new Thread::Binder<Callable, Arg>(c, a);
CreateThread(0, 0,
Thread::nested< Thread::Binder<Callable, Arg> >::run,
b, 0, &this->_id);
}
当我尝试编译时,VS 给了我一个错误 C2039:
'nested<Thread::Binder<unsigned long (__cdecl*)(int *),int *> >' : is not a member of 'Thread'
g++怎么能看到VS却看不到呢?大多数情况下,我认为这是因为模板专业化,但这是怎么回事?
【问题讨论】:
-
我在这里没有看到任何专业化。
-
此代码无法在 Fedora 14 上使用 g++ 4.5.1 进行编译。test.c:47:26: error: ‘class Thread’ has no member named ‘_id’
-
这段代码显然是windows版本,除非你把DWORD改成int,否则它不会在Fedora上编译。
-
由于我无法编辑您的帖子,请修正
Binder::operator()和Binder::exec()中的语法错误。
标签: c++ windows class templates nested