VS 2005模板的一個問題及解決方案
我也不知道這個能不能算是2005的bug吧,反正我是想不太明白。
今天在對我的pool使用policy的設計的時候發現的。
解決的方法很簡單:
typedef ThreadingModel TM;
typedef TM::thread_safe_type<size_t>::result index_t;
就可以大功告成了。不知道是不是typename的問題。但是從編譯器的出錯提示來看并不能和簡單的typename的問題混為一談。另外,如果這個thread_safe_type不是模板而只是一個普通的struct或者typedef的話,也是沒有這個問題的。
如果有知道這個問題出現的根本原因的,請指教。
今天在對我的pool使用policy的設計的時候發現的。
//前面代碼省略
struct single_thread
{
template<class T> struct thread_safe_type
{
typedef boost::add_volatile<T> result;
}
};
template<class ThreadingModel>
struct pool : private ThreadingModel
{
typedef typename ThreadingModel::thread_safe_type<size_t>::result index_t;//其實有沒有typename都一樣。
//other public members
private:
index_t first_free_;
};
看起來這段代碼是完全能正常工作的,是吧。可是很不幸的是這代碼在2005上沒法正常通過。struct single_thread
{
template<class T> struct thread_safe_type
{
typedef boost::add_volatile<T> result;
}
};
template<class ThreadingModel>
struct pool : private ThreadingModel
{
typedef typename ThreadingModel::thread_safe_type<size_t>::result index_t;//其實有沒有typename都一樣。
//other public members
private:
index_t first_free_;
};
解決的方法很簡單:
typedef ThreadingModel TM;
typedef TM::thread_safe_type<size_t>::result index_t;
就可以大功告成了。不知道是不是typename的問題。但是從編譯器的出錯提示來看并不能和簡單的typename的問題混為一談。另外,如果這個thread_safe_type不是模板而只是一個普通的struct或者typedef的話,也是沒有這個問題的。
如果有知道這個問題出現的根本原因的,請指教。
posted on 2008-08-31 21:44 肥仔 閱讀(284) 評論(0) 編輯 收藏 引用 所屬分類: C++ 模板