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 に答える