2012-05-11 112 views
1

我想實現一個通用的哈希表類使用模板,我試圖從基類繼承,但得到大量的編譯錯誤。這裏是我的代碼:C++繼承和模板不編譯

#ifndef BASEHASHLIST_H_ 
#define BASEHASHLIST_H_ 

#include <string> 
#include <boost/unordered_set.hpp> 
#include <iostream> 
#include <boost/interprocess/sync/interprocess_semaphore.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 



    template <typename T> 
    class BaseHashList 
    { 

    private: 
     boost::interprocess::interprocess_semaphore m_semaphore; 

    protected: 

     boost::unordered_set<T> m_hsHashSet;     
     typename boost::unordered_set<T>::iterator m_hsIter;    
    public: 

     BaseHashList(); 
    }; 

    template <typename T> 
    BaseHashList<T>::BaseHashList():m_semaphore(1){} 

#endif /* BASEHASHLIST_H_ */ 

這裏是從基類繼承的類:

#ifndef ACCOUNTLIST_H_ 
#define ACCOUNTLIST_H_ 

#include "BaseHashList.h" 

    class AccountList : public BaseHashList<unsigned long> 
    { 
    public: 
     AccountList(std::string p_strFile, unsigned long p_ulMaxAccountNo); 
     ~AccountList(void); 

     int m_iVersion; 
     std::string m_strFilePath; 


    private: 
     unsigned long m_ulMaxAccountNo; 
    }; 


#endif /* ACCOUNTLIST_H_ */ 

,這裏是cpp文件:

#include "AccountList.h" 

AccountList::AccountList(std::string p_strFile, unsigned long p_ulMaxAccountNo) 
: BaseHashList<unsigned long>::m_hsHashSet<unsigned long>(), 
    m_iVersion(0), 
    m_strFilePath(p_strFile) 
{ 
    m_ulMaxAccountNo = p_ulMaxAccountNo; 
} 


AccountList::~AccountList(){} 

我收到一個很多編譯時錯誤,如:

預期的標記之前的模板名稱'<' 預期「(」前令牌「<」

對於這樣一個簡單的任務,我花了幾個小時,我是超級沮喪,任何人都不會看到我在做什麼錯在這裏?

回答

2

這initaliser在AccountList的構造看起來我錯了:

BaseHashList<unsigned long>::m_hsHashSet<unsigned long>() 

你應該initalise的BaseHashList成員BaseHashList本身在構造函數中,一個總是或隱或顯地叫。

這個例子被簡化,同樣錯誤:

struct A { 
    int bar; 
}; 

struct B : A { 
    B() : A::bar(0) {} 
}; 

(話說bar(0)也將是有錯)

但是你可以得到所需的行爲:

struct A { 
    A() : bar(0) {} 
    int bar; 
}; 

struct B : A { 
    B() {} // Implicitly calls A::A although we could have explicitly called it 
}; 

的構造A被召集,並有機會讓其成員在這裏仍然活躍起來。

0

當你從一個模板類繼承時,必須將模板指令添加到子類太:

template <typename T> 
class A : public B<T> 

你也有構造函數和方法的定義之前添加模板指令:

template <typename T> 
A<T>::A() : B<T>() {...} 

template <typename T> 
A<T>::~A() {...}