我正在嘗試使用模板專門化來實現帶有句柄void的模板函數。靜態成員函數的模板特化;如何?
下面的代碼讓我在GCC的「非命名空間範圍明確分工」:
template <typename T>
static T safeGuiCall(boost::function<T()> _f)
{
if (_f.empty())
throw GuiException("Function pointer empty");
{
ThreadGuard g;
T ret = _f();
return ret;
}
}
// template specialization for functions wit no return value
template <>
static void safeGuiCall<void>(boost::function<void()> _f)
{
if (_f.empty())
throw GuiException("Function pointer empty");
{
ThreadGuard g;
_f();
}
}
我試圖移動它的類(類不是模板),並進入命名空間,但那麼我得到錯誤「明確的專業化不能有一個存儲類」。我已閱讀了許多關於此的討論,但人們似乎不同意如何專門化功能模板。有任何想法嗎?
感謝您的回答。對我來說,不管他們是否在課堂內都沒關係;但我無法以任何方式使它工作。我的語法錯了或者我提供的代碼中有什麼? – Rolle 2009-04-20 09:23:22
重點在於,您可以使用限定的函數聲明器明確地專門化名稱空間中的函數。 C++不允許您重新添加「靜態」關鍵字,因此您只需刪除它即可。我上面的例子展示瞭如何明確地專門化一個靜態成員。 – 2009-04-20 11:43:39