最近研究<< Object Detection and Recognition in Digital Images Theory and Practice >> 這部神作的時候,從網上下載了一份源碼,準備看看效果,結果沒有編譯通過,代碼如下:
...
template < typename T >
class safe_pointer_vector : public vector< T * >
{
public:
...
typedef vector< T * > BaseClass;
...
public:
iterator erase( BaseClass::const_iterator _First_arg, BaseClass::const_iterator _Last_arg )
{
DeleteElements( _First_arg, _Last_arg );
return BaseClass::erase( _First_arg, _Last_arg ); // now call the base
}
編譯時候死活通不過去,看看代碼感覺也沒啥多少問題,後來查找資料發現 http://www.cnblogs.com/dongzhiquan/p/4050997.html
在c++模板中,使用std::vector::const_iterator時,編譯器假定這樣的名字指定的是數據成員,而不是數據類型成員,如果需要指定爲數據類型成員需要使用 typename 關鍵字
於是改成如下形式, 工程成功編譯
ie, 將 這邊的 BaseClass::const_iterator
改爲typename vector<T*>::const_iterator
即可
...
template < typename T >
class safe_pointer_vector : public vector< T * >
{
public:
...
typedef vector< T * > BaseClass;
...
public:
iterator erase( typename vector<T*>::const_iterator _First_arg, typename vector<T*>::const_iterator _Last_arg )
{
DeleteElements( _First_arg, _Last_arg );
return BaseClass::erase( _First_arg, _Last_arg ); // now call the base
}