typedef 名不能位于类或结构或联合之后的问题的解决办法
源代码如下:
template<class TObj>
struct SObjImpl{
RECT m_rct;
std::deque<TObj*> m_ObjCnt;
typedef class std::deque<TObj*>::iterator ObjItr;
virtual ~SObjImpl(){
ObjItr itr(m_ObjCnt.begin());
while(itr!=m_ObjCnt.end())delete *itr++;
m_ObjCnt.clear();
}
virtual void Recalc()=0;
};
struct SObjImpl{
RECT m_rct;
std::deque<TObj*> m_ObjCnt;
typedef class std::deque<TObj*>::iterator ObjItr;
virtual ~SObjImpl(){
ObjItr itr(m_ObjCnt.begin());
while(itr!=m_ObjCnt.end())delete *itr++;
m_ObjCnt.clear();
}
virtual void Recalc()=0;
};
使用VS2008 SP1编译时报错:
1>d:\test\controltest\controltest\gridctrls\gridctrl\gridctrl.h(324) : error C2242: typedef 名不能位于类/结构/联合之后
1> d:\test\controltest\controltest\gridctrls\gridctrl\gridctrl.h(333): 参见对正在编译的类 模板 实例化“SObjImpl<TObj>”的引用
解决办法:
typedef class std::deque<TObj*>::iterator ObjItr;
改成
typedef typename std::deque<TObj*>::iterator ObjItr;
明确std::deque<TObj*>::iterator为一个类型名称。