1

我正在尝试使用模板实现一个通用的哈希列表类,并且我正在尝试从基类继承但得到很多编译错误。这是我的代码:

#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(){}

我收到很多编译时错误,例如:

令牌 '<' 之前的预期模板名称 令牌 '<' 之前的预期 '('

对于这样一个简单的任务,我花了几个小时,我非常沮丧,有人看到我在这里做错了吗?

4

2 回答 2

2

的构造函数中的这个初始化器在AccountList我看来是错误的:

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

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 的构造函数被调用并有机会在这里初始化其成员。

于 2012-05-11T09:25:50.703 回答
0

当您从模板类继承时,您还必须将模板指令添加到子类:

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

您还必须在构造函数和方法的定义之前添加模板指令:

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

template <typename T>
A<T>::~A() {...}
于 2012-05-11T10:36:03.320 回答